IVGCVSW-2405 Rename SubGraph to SubgraphView

Change-Id: Ie50aeccf053c20c3a01a75042bbc3acd824375af
Signed-off-by: Derek Lamberti <derek.lamberti@arm.com>
Signed-off-by: Matteo Martincigh <matteo.martincigh@arm.com>
diff --git a/Android.mk b/Android.mk
index 3e2494d..3d69a04 100644
--- a/Android.mk
+++ b/Android.mk
@@ -134,8 +134,8 @@
         src/armnn/Optimizer.cpp \
         src/armnn/Runtime.cpp \
         src/armnn/SerializeLayerParameters.cpp \
-        src/armnn/SubGraph.cpp \
-        src/armnn/SubGraphSelector.cpp \
+        src/armnn/SubgraphView.cpp \
+        src/armnn/SubgraphViewSelector.cpp \
         src/armnn/InternalTypes.cpp \
         src/armnn/Layer.cpp \
         src/armnn/LoadedNetwork.cpp \
@@ -242,7 +242,7 @@
         src/armnn/test/GraphTests.cpp \
         src/armnn/test/GraphUtils.cpp \
         src/armnn/test/RuntimeTests.cpp \
-        src/armnn/test/SubGraphTests.cpp \
+        src/armnn/test/SubgraphViewTests.cpp \
         src/armnn/test/TensorTest.cpp \
         src/armnn/test/NetworkTests.cpp \
         src/armnn/test/InstrumentTests.cpp \
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 233ef3c..297cbcd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -294,7 +294,7 @@
     src/armnn/Instrument.hpp
     src/armnn/InternalTypes.cpp
     src/armnn/InternalTypes.hpp
-    src/armnn/ISubGraphConverter.hpp
+    src/armnn/ISubgraphViewConverter.hpp
     src/armnn/JsonPrinter.cpp
     src/armnn/JsonPrinter.hpp
     src/armnn/Layer.cpp
@@ -335,10 +335,10 @@
     src/armnn/SerializeLayerParameters.hpp
     src/armnn/StaticRangeVisitor.cpp
     src/armnn/StaticRangeVisitor.hpp
-    src/armnn/SubGraph.cpp
-    src/armnn/SubGraph.hpp
-    src/armnn/SubGraphSelector.cpp
-    src/armnn/SubGraphSelector.hpp
+    src/armnn/SubgraphView.cpp
+    src/armnn/SubgraphView.hpp
+    src/armnn/SubgraphViewSelector.cpp
+    src/armnn/SubgraphViewSelector.hpp
     src/armnn/Tensor.cpp
     src/armnn/TypesUtils.cpp
     src/armnn/Utils.cpp
@@ -435,7 +435,7 @@
         src/armnn/test/QuantizerTest.cpp
         src/armnn/test/RuntimeTests.cpp
         src/armnn/test/RuntimeTests.hpp
-        src/armnn/test/SubGraphTests.cpp
+        src/armnn/test/SubgraphViewTests.cpp
         src/armnn/test/TensorHelpers.hpp
         src/armnn/test/TensorTest.cpp
         src/armnn/test/TestInputOutputLayerVisitor.cpp
diff --git a/src/armnn/Graph.cpp b/src/armnn/Graph.cpp
index be0dd5f..335f195 100644
--- a/src/armnn/Graph.cpp
+++ b/src/armnn/Graph.cpp
@@ -4,7 +4,7 @@
 //
 
 #include "Graph.hpp"
-#include "SubGraph.hpp"
+#include "SubgraphView.hpp"
 #include "LayersFwd.hpp"
 
 #include <armnn/Utils.hpp>
@@ -298,88 +298,88 @@
     }
 }
 
-void Graph::SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, IConnectableLayer* substituteLayer)
+void Graph::SubstituteSubgraph(std::unique_ptr<SubgraphView> subgraph, IConnectableLayer* substituteLayer)
 {
-    BOOST_ASSERT(subGraph != nullptr);
+    BOOST_ASSERT(subgraph != nullptr);
     BOOST_ASSERT(substituteLayer != nullptr);
 
-    ReplaceSubGraphConnections(*subGraph, substituteLayer);
-    EraseSubGraphLayers(*subGraph);
+    ReplaceSubgraphConnections(*subgraph, substituteLayer);
+    EraseSubgraphLayers(*subgraph);
 }
 
-void Graph::SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, const SubGraph& substituteSubGraph)
+void Graph::SubstituteSubgraph(std::unique_ptr<SubgraphView> subgraph, const SubgraphView& substituteSubgraph)
 {
-    BOOST_ASSERT(subGraph);
+    BOOST_ASSERT(subgraph);
 
-    ReplaceSubGraphConnections(*subGraph, substituteSubGraph);
-    EraseSubGraphLayers(*subGraph);
+    ReplaceSubgraphConnections(*subgraph, substituteSubgraph);
+    EraseSubgraphLayers(*subgraph);
 }
 
-void Graph::ReplaceSubGraphConnections(const SubGraph& subGraph, IConnectableLayer* substituteLayer)
+void Graph::ReplaceSubgraphConnections(const SubgraphView& subgraph, IConnectableLayer* substituteLayer)
 {
     BOOST_ASSERT(substituteLayer != nullptr);
 
     // Create a new sub-graph with only the given layer, using
     // the given sub-graph as a reference of which parent graph to use
-    SubGraph substituteSubGraph(subGraph, substituteLayer);
-    ReplaceSubGraphConnections(subGraph, substituteSubGraph);
+    SubgraphView substituteSubgraph(subgraph, substituteLayer);
+    ReplaceSubgraphConnections(subgraph, substituteSubgraph);
 }
 
-void Graph::ReplaceSubGraphConnections(const SubGraph& subGraph, const SubGraph& substituteSubGraph)
+void Graph::ReplaceSubgraphConnections(const SubgraphView& subgraph, const SubgraphView& substituteSubgraph)
 {
-    BOOST_ASSERT_MSG(!substituteSubGraph.GetLayers().empty(), "New sub-graph used for substitution must not be empty");
+    BOOST_ASSERT_MSG(!substituteSubgraph.GetLayers().empty(), "New sub-graph used for substitution must not be empty");
 
-    const SubGraph::Layers& substituteSubGraphLayers = substituteSubGraph.GetLayers();
-    std::for_each(substituteSubGraphLayers.begin(), substituteSubGraphLayers.end(), [&](Layer* layer)
+    const SubgraphView::Layers& substituteSubgraphLayers = substituteSubgraph.GetLayers();
+    std::for_each(substituteSubgraphLayers.begin(), substituteSubgraphLayers.end(), [&](Layer* layer)
     {
         BOOST_ASSERT_MSG(std::find(m_Layers.begin(), m_Layers.end(), layer) != m_Layers.end(),
                          "Substitute layer is not a member of graph");
     });
 
-    const SubGraph::InputSlots& subGraphInputSlots = subGraph.GetInputSlots();
-    const SubGraph::OutputSlots& subGraphOutputSlots = subGraph.GetOutputSlots();
+    const SubgraphView::InputSlots& subgraphInputSlots = subgraph.GetInputSlots();
+    const SubgraphView::OutputSlots& subgraphOutputSlots = subgraph.GetOutputSlots();
 
-    unsigned int subGraphNumInputSlots = boost::numeric_cast<unsigned int>(subGraphInputSlots.size());
-    unsigned int subGraphNumOutputSlots = boost::numeric_cast<unsigned int>(subGraphOutputSlots.size());
+    unsigned int subgraphNumInputSlots = boost::numeric_cast<unsigned int>(subgraphInputSlots.size());
+    unsigned int subgraphNumOutputSlots = boost::numeric_cast<unsigned int>(subgraphOutputSlots.size());
 
-    const SubGraph::InputSlots& substituteSubGraphInputSlots = substituteSubGraph.GetInputSlots();
-    const SubGraph::OutputSlots& substituteSubGraphOutputSlots = substituteSubGraph.GetOutputSlots();
+    const SubgraphView::InputSlots& substituteSubgraphInputSlots = substituteSubgraph.GetInputSlots();
+    const SubgraphView::OutputSlots& substituteSubgraphOutputSlots = substituteSubgraph.GetOutputSlots();
 
-    BOOST_ASSERT(subGraphNumInputSlots == substituteSubGraphInputSlots.size());
-    BOOST_ASSERT(subGraphNumOutputSlots == substituteSubGraphOutputSlots.size());
+    BOOST_ASSERT(subgraphNumInputSlots == substituteSubgraphInputSlots.size());
+    BOOST_ASSERT(subgraphNumOutputSlots == substituteSubgraphOutputSlots.size());
 
     // Disconnect the sub-graph and replace it with the substitute sub-graph
 
     // Step 1: process input slots
-    for (unsigned int inputSlotIdx = 0; inputSlotIdx < subGraphNumInputSlots; ++inputSlotIdx)
+    for (unsigned int inputSlotIdx = 0; inputSlotIdx < subgraphNumInputSlots; ++inputSlotIdx)
     {
-        InputSlot* subGraphInputSlot = subGraphInputSlots.at(inputSlotIdx);
-        BOOST_ASSERT(subGraphInputSlot);
+        InputSlot* subgraphInputSlot = subgraphInputSlots.at(inputSlotIdx);
+        BOOST_ASSERT(subgraphInputSlot);
 
-        IOutputSlot* connectedOutputSlot = subGraphInputSlot->GetConnection();
+        IOutputSlot* connectedOutputSlot = subgraphInputSlot->GetConnection();
         BOOST_ASSERT(connectedOutputSlot);
-        connectedOutputSlot->Disconnect(*subGraphInputSlot);
+        connectedOutputSlot->Disconnect(*subgraphInputSlot);
 
-        IInputSlot* substituteInputSlot = substituteSubGraphInputSlots.at(inputSlotIdx);
+        IInputSlot* substituteInputSlot = substituteSubgraphInputSlots.at(inputSlotIdx);
         BOOST_ASSERT(substituteInputSlot);
         connectedOutputSlot->Connect(*substituteInputSlot);
     }
 
     // Step 2: process output slots
-    for(unsigned int outputSlotIdx = 0; outputSlotIdx < subGraphNumOutputSlots; ++outputSlotIdx)
+    for(unsigned int outputSlotIdx = 0; outputSlotIdx < subgraphNumOutputSlots; ++outputSlotIdx)
     {
-        OutputSlot* subGraphOutputSlot = subGraphOutputSlots.at(outputSlotIdx);
-        BOOST_ASSERT(subGraphOutputSlot);
+        OutputSlot* subgraphOutputSlot = subgraphOutputSlots.at(outputSlotIdx);
+        BOOST_ASSERT(subgraphOutputSlot);
 
-        OutputSlot* substituteOutputSlot = substituteSubGraphOutputSlots.at(outputSlotIdx);
+        OutputSlot* substituteOutputSlot = substituteSubgraphOutputSlots.at(outputSlotIdx);
         BOOST_ASSERT(substituteOutputSlot);
-        subGraphOutputSlot->MoveAllConnections(*substituteOutputSlot);
+        subgraphOutputSlot->MoveAllConnections(*substituteOutputSlot);
     }
 }
 
-void Graph::EraseSubGraphLayers(const SubGraph &subGraph)
+void Graph::EraseSubgraphLayers(const SubgraphView &subgraph)
 {
-    for (auto layer : subGraph.GetLayers())
+    for (auto layer : subgraph.GetLayers())
     {
         EraseLayer(layer);
     }
diff --git a/src/armnn/Graph.hpp b/src/armnn/Graph.hpp
index dd6a825..cc0ccae 100644
--- a/src/armnn/Graph.hpp
+++ b/src/armnn/Graph.hpp
@@ -24,7 +24,7 @@
 namespace armnn
 {
 
-class SubGraph;
+class SubgraphView;
 
 class Graph
 {
@@ -163,8 +163,8 @@
 
     /// Substitutes the given sub-graph with either a new layer or a new sub-graph.
     /// In either case, the given layer or all the layers in the given sub-graph must belong to this graph.
-    void SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, IConnectableLayer* substituteLayer);
-    void SubstituteSubGraph(std::unique_ptr<SubGraph> subGraph, const SubGraph& substituteSubGraph);
+    void SubstituteSubgraph(std::unique_ptr<SubgraphView> subgraph, IConnectableLayer* substituteLayer);
+    void SubstituteSubgraph(std::unique_ptr<SubgraphView> subgraph, const SubgraphView& substituteSubgraph);
 
     void InferTensorInfos();
 
@@ -217,9 +217,9 @@
     std::unordered_set<LayerBindingId> m_OutputIds;
     std::unordered_map<const Layer*, Iterator> m_PosInGraphMap;
 
-    void ReplaceSubGraphConnections(const SubGraph& subGraph, IConnectableLayer* substituteLayer);
-    void ReplaceSubGraphConnections(const SubGraph& subGraph, const SubGraph& substituteSubGraph);
-    void EraseSubGraphLayers(const SubGraph &subGraph);
+    void ReplaceSubgraphConnections(const SubgraphView& subgraph, IConnectableLayer* substituteLayer);
+    void ReplaceSubgraphConnections(const SubgraphView& subgraph, const SubgraphView& substituteSubgraph);
+    void EraseSubgraphLayers(const SubgraphView &subgraph);
 
     /// Mutable to allow sorting on const object.
     mutable LayerList m_Layers;
diff --git a/src/armnn/ISubGraphConverter.hpp b/src/armnn/ISubgraphViewConverter.hpp
similarity index 85%
rename from src/armnn/ISubGraphConverter.hpp
rename to src/armnn/ISubgraphViewConverter.hpp
index 3a6866e..1f4b4e5 100644
--- a/src/armnn/ISubGraphConverter.hpp
+++ b/src/armnn/ISubgraphViewConverter.hpp
@@ -15,10 +15,10 @@
 using CompiledBlobDeleter = std::function<void(const void*)>;
 using CompiledBlobPtr = std::unique_ptr<void, CompiledBlobDeleter>;
 
-class ISubGraphConverter
+class ISubgraphViewConverter
 {
 public:
-    virtual ~ISubGraphConverter() {}
+    virtual ~ISubgraphViewConverter() {}
 
     virtual std::vector<CompiledBlobPtr> GetOutput() = 0;
 };
diff --git a/src/armnn/Network.cpp b/src/armnn/Network.cpp
index a38bcf1..9ef0c56 100644
--- a/src/armnn/Network.cpp
+++ b/src/armnn/Network.cpp
@@ -8,7 +8,7 @@
 #include "Layer.hpp"
 #include "DeviceSpec.hpp"
 #include "Optimizer.hpp"
-#include "SubGraphSelector.hpp"
+#include "SubgraphViewSelector.hpp"
 #include "BackendSettings.hpp"
 #include "optimizations/All.hpp"
 
@@ -311,11 +311,11 @@
 
 OptimizationResult AssignBackends(OptimizedNetwork* optNetObjPtr,
                                   BackendSettings& backendSettings,
-                                  SubGraph& subGraph,
+                                  SubgraphView& subgraph,
                                   Optional<std::vector<std::string>&> errMessages)
 {
-    Graph::Iterator firstLayer = subGraph.begin();
-    Graph::Iterator lastLayer  = subGraph.end();
+    Graph::Iterator firstLayer = subgraph.begin();
+    Graph::Iterator lastLayer  = subgraph.end();
     return AssignBackends(optNetObjPtr,
                           backendSettings,
                           firstLayer,
@@ -335,7 +335,7 @@
     Graph& optGraph = optNetObjPtr->GetGraph();
 
     // Get the entire graph as a sub-graph
-    SubGraph mainSubGraph(optGraph);
+    SubgraphView mainSubgraph(optGraph);
 
     // Run backend specific optimizations
     auto const& backendRegistry = BackendRegistryInstance();
@@ -346,8 +346,8 @@
         BOOST_ASSERT(backendObjPtr);
 
         // Select sub-graphs based on backend
-        SubGraphSelector::SubGraphs subGraphs =
-                SubGraphSelector::SelectSubGraphs(mainSubGraph,
+        SubgraphViewSelector::Subgraphs subgraphs =
+                SubgraphViewSelector::SelectSubgraphs(mainSubgraph,
                                                   // Select layers assigned to the requested backend
                                                   [&backendObjPtr](const Layer& layer)
                                                   {
@@ -355,18 +355,19 @@
                                                              layer.GetType() != LayerType::Output &&
                                                              layer.GetBackendId() == backendObjPtr->GetId();
                                                   });
-        if (subGraphs.empty())
+        if (subgraphs.empty())
         {
             // No sub-graphs found, try with next selected backend
             continue;
         }
 
         // Try to optimize each sub-graph
-        for (auto& subGraph : subGraphs)
+        for (auto& subgraph : subgraphs)
         {
             // Try to optimize the current sub-graph
             bool optimizationAttempted = false;
-            SubGraph::SubGraphPtr optSubGraph = backendObjPtr->OptimizeSubGraph(*subGraph, optimizationAttempted);
+            SubgraphView::SubgraphViewPtr optSubgraph = backendObjPtr->OptimizeSubgraphView(*subgraph,
+                                                                                            optimizationAttempted);
 
             // Check if the optimization has been attempted
             if (!optimizationAttempted)
@@ -376,27 +377,27 @@
             }
 
             // Optimization attempted, check the resulting optimized sub-graph
-            if (optSubGraph)
+            if (optSubgraph)
             {
                 // Sub-graph optimized, substitute the sub-graph with the new optimized one in the main optimized graph
-                optGraph.SubstituteSubGraph(std::move(subGraph), *optSubGraph);
+                optGraph.SubstituteSubgraph(std::move(subgraph), *optSubgraph);
 
                 // Assign the current backend to the optimized sub-graph
-                std::for_each(optSubGraph->begin(), optSubGraph->end(), [&selectedBackend](Layer* l)
+                std::for_each(optSubgraph->begin(), optSubgraph->end(), [&selectedBackend](Layer* l)
                 {
                     BOOST_ASSERT(l);
                     l->SetBackendId(selectedBackend);
                 });
 
                 // Recreate the sub-graph representing the entire graph
-                mainSubGraph.Update(optGraph);
+                mainSubgraph.Update(optGraph);
             }
             else
             {
                 // An error occurred: the optimization was attempted but not performed, try different backends
                 std::stringstream warningMsg;
                 warningMsg << "Sub-graph failed to get optimized on " << backendObjPtr->GetId() << ". "
-                           << "Re-assigning backends to " << subGraph->GetLayers().size() << " layers inside sub-graph";
+                           << "Re-assigning backends to " << subgraph->GetLayers().size() << " layers inside sub-graph";
                 ReportWarning(warningMsg.str(), errMessages);
 
                 // Failed to optimize the given sub-graph, re-assign the sub-graph layers to other available backends
@@ -407,7 +408,7 @@
                 }
                 OptimizationResult reassignmentResult = AssignBackends(optNetObjPtr,
                                                                        backendSettings,
-                                                                       *subGraph,
+                                                                       *subgraph,
                                                                        errMessages);
                 if (reassignmentResult.m_Error)
                 {
diff --git a/src/armnn/NetworkUtils.cpp b/src/armnn/NetworkUtils.cpp
index 126b56b..66940e4 100644
--- a/src/armnn/NetworkUtils.cpp
+++ b/src/armnn/NetworkUtils.cpp
@@ -5,7 +5,7 @@
 
 #include "NetworkUtils.hpp"
 
-#include "SubGraphSelector.hpp"
+#include "SubgraphViewSelector.hpp"
 
 #include <armnn/Exceptions.hpp>
 
diff --git a/src/armnn/SubGraphSelector.hpp b/src/armnn/SubGraphSelector.hpp
deleted file mode 100644
index 371ba78..0000000
--- a/src/armnn/SubGraphSelector.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Copyright © 2017 Arm Ltd. All rights reserved.
-// SPDX-License-Identifier: MIT
-//
-#pragma once
-
-#include "SubGraph.hpp"
-#include <functional>
-#include <memory>
-
-namespace armnn
-{
-
-class Layer;
-class Graph;
-
-class SubGraphSelector final
-{
-public:
-    using SubGraphPtr = std::unique_ptr<SubGraph>;
-    using SubGraphs = std::vector<SubGraphPtr>;
-    using LayerSelectorFunction = std::function<bool(const Layer&)>;
-
-    /// Selects subgraphs from a graph based on the selector function and the algorithm.
-    /// Since the SubGraphs object returns modifiable pointers to the input and output slots of the graph:
-    ///  1) the graph/sub-graph cannot be const
-    ///  2) the caller needs to make sure that the SubGraphs lifetime is shorter than the parent graph's
-    static SubGraphs SelectSubGraphs(Graph& graph, const LayerSelectorFunction& selector);
-    static SubGraphs SelectSubGraphs(SubGraph& subGraph, const LayerSelectorFunction& selector);
-
-private:
-    // this is a utility class, don't construct or copy
-    SubGraphSelector() = delete;
-    SubGraphSelector(const SubGraphSelector&) = delete;
-    SubGraphSelector & operator=(const SubGraphSelector&) = delete;
-};
-
-} // namespace armnn
diff --git a/src/armnn/SubGraph.cpp b/src/armnn/SubgraphView.cpp
similarity index 61%
rename from src/armnn/SubGraph.cpp
rename to src/armnn/SubgraphView.cpp
index d0fc760..23f969d 100644
--- a/src/armnn/SubGraph.cpp
+++ b/src/armnn/SubgraphView.cpp
@@ -3,7 +3,7 @@
 // SPDX-License-Identifier: MIT
 //
 
-#include "SubGraph.hpp"
+#include "SubgraphView.hpp"
 #include "Graph.hpp"
 
 #include <boost/numeric/conversion/cast.hpp>
@@ -38,56 +38,59 @@
 
 } // anonymous namespace
 
-SubGraph::SubGraph(Graph& graph)
+SubgraphView::SubgraphView(Graph& graph)
     : m_InputSlots{}
     , m_OutputSlots{}
     , m_Layers(graph.begin(), graph.end())
     , m_ParentGraph(&graph)
 {
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-SubGraph::SubGraph(Graph* parentGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers)
+SubgraphView::SubgraphView(Graph* parentGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers)
     : m_InputSlots{inputs}
     , m_OutputSlots{outputs}
     , m_Layers{layers}
     , m_ParentGraph(parentGraph)
 {
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-SubGraph::SubGraph(const SubGraph& referenceSubGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers)
+SubgraphView::SubgraphView(const SubgraphView& referenceSubgraph,
+                           InputSlots&& inputs,
+                           OutputSlots&& outputs,
+                           Layers&& layers)
     : m_InputSlots{inputs}
     , m_OutputSlots{outputs}
     , m_Layers{layers}
-    , m_ParentGraph(referenceSubGraph.m_ParentGraph)
+    , m_ParentGraph(referenceSubgraph.m_ParentGraph)
 {
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-SubGraph::SubGraph(const SubGraph& subGraph)
-    : m_InputSlots(subGraph.m_InputSlots.begin(), subGraph.m_InputSlots.end())
-    , m_OutputSlots(subGraph.m_OutputSlots.begin(), subGraph.m_OutputSlots.end())
-    , m_Layers(subGraph.m_Layers.begin(), subGraph.m_Layers.end())
-    , m_ParentGraph(subGraph.m_ParentGraph)
+SubgraphView::SubgraphView(const SubgraphView& subgraph)
+    : m_InputSlots(subgraph.m_InputSlots.begin(), subgraph.m_InputSlots.end())
+    , m_OutputSlots(subgraph.m_OutputSlots.begin(), subgraph.m_OutputSlots.end())
+    , m_Layers(subgraph.m_Layers.begin(), subgraph.m_Layers.end())
+    , m_ParentGraph(subgraph.m_ParentGraph)
 {
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-SubGraph::SubGraph(SubGraph&& subGraph)
-    : m_InputSlots(std::move(subGraph.m_InputSlots))
-    , m_OutputSlots(std::move(subGraph.m_OutputSlots))
-    , m_Layers(std::move(subGraph.m_Layers))
-    , m_ParentGraph(std::exchange(subGraph.m_ParentGraph, nullptr))
+SubgraphView::SubgraphView(SubgraphView&& subgraph)
+    : m_InputSlots(std::move(subgraph.m_InputSlots))
+    , m_OutputSlots(std::move(subgraph.m_OutputSlots))
+    , m_Layers(std::move(subgraph.m_Layers))
+    , m_ParentGraph(std::exchange(subgraph.m_ParentGraph, nullptr))
 {
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-SubGraph::SubGraph(const SubGraph& referenceSubGraph, IConnectableLayer* layer)
+SubgraphView::SubgraphView(const SubgraphView& referenceSubgraph, IConnectableLayer* layer)
     : m_InputSlots{}
     , m_OutputSlots{}
     , m_Layers{boost::polymorphic_downcast<Layer*>(layer)}
-    , m_ParentGraph(referenceSubGraph.m_ParentGraph)
+    , m_ParentGraph(referenceSubgraph.m_ParentGraph)
 {
     unsigned int numInputSlots = layer->GetNumInputSlots();
     m_InputSlots.resize(numInputSlots);
@@ -103,10 +106,10 @@
         m_OutputSlots.at(i) = boost::polymorphic_downcast<OutputSlot*>(&(layer->GetOutputSlot(i)));
     }
 
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-void SubGraph::CheckSubGraph()
+void SubgraphView::CheckSubgraph()
 {
     // Check that the sub-graph has a valid parent graph
     BOOST_ASSERT_MSG(m_ParentGraph, "Sub-graphs must have a parent graph");
@@ -128,87 +131,87 @@
     });
 }
 
-void SubGraph::Update(Graph &graph)
+void SubgraphView::Update(Graph &graph)
 {
     m_InputSlots.clear();
     m_OutputSlots.clear();
     m_Layers.assign(graph.begin(), graph.end());
     m_ParentGraph = &graph;
 
-    CheckSubGraph();
+    CheckSubgraph();
 }
 
-const SubGraph::InputSlots& SubGraph::GetInputSlots() const
+const SubgraphView::InputSlots& SubgraphView::GetInputSlots() const
 {
     return m_InputSlots;
 }
 
-const SubGraph::OutputSlots& SubGraph::GetOutputSlots() const
+const SubgraphView::OutputSlots& SubgraphView::GetOutputSlots() const
 {
     return m_OutputSlots;
 }
 
-const InputSlot* SubGraph::GetInputSlot(unsigned int index) const
+const InputSlot* SubgraphView::GetInputSlot(unsigned int index) const
 {
     return m_InputSlots.at(index);
 }
 
-InputSlot* SubGraph::GetInputSlot(unsigned int index)
+InputSlot* SubgraphView::GetInputSlot(unsigned int index)
 {
     return  m_InputSlots.at(index);
 }
 
-const OutputSlot* SubGraph::GetOutputSlot(unsigned int index) const
+const OutputSlot* SubgraphView::GetOutputSlot(unsigned int index) const
 {
     return m_OutputSlots.at(index);
 }
 
-OutputSlot* SubGraph::GetOutputSlot(unsigned int index)
+OutputSlot* SubgraphView::GetOutputSlot(unsigned int index)
 {
     return m_OutputSlots.at(index);
 }
 
-unsigned int SubGraph::GetNumInputSlots() const
+unsigned int SubgraphView::GetNumInputSlots() const
 {
     return boost::numeric_cast<unsigned int>(m_InputSlots.size());
 }
 
-unsigned int SubGraph::GetNumOutputSlots() const
+unsigned int SubgraphView::GetNumOutputSlots() const
 {
     return boost::numeric_cast<unsigned int>(m_OutputSlots.size());
 }
 
-const SubGraph::Layers & SubGraph::GetLayers() const
+const SubgraphView::Layers & SubgraphView::GetLayers() const
 {
     return m_Layers;
 }
 
-SubGraph::Layers::iterator SubGraph::begin()
+SubgraphView::Layers::iterator SubgraphView::begin()
 {
     return m_Layers.begin();
 }
 
-SubGraph::Iterator SubGraph::end()
+SubgraphView::Iterator SubgraphView::end()
 {
     return m_Layers.end();
 }
 
-SubGraph::ConstIterator SubGraph::begin() const
+SubgraphView::ConstIterator SubgraphView::begin() const
 {
     return m_Layers.begin();
 }
 
-SubGraph::ConstIterator SubGraph::end() const
+SubgraphView::ConstIterator SubgraphView::end() const
 {
     return m_Layers.end();
 }
 
-SubGraph::ConstIterator SubGraph::cbegin() const
+SubgraphView::ConstIterator SubgraphView::cbegin() const
 {
     return begin();
 }
 
-SubGraph::ConstIterator SubGraph::cend() const
+SubgraphView::ConstIterator SubgraphView::cend() const
 {
     return end();
 }
diff --git a/src/armnn/SubGraph.hpp b/src/armnn/SubgraphView.hpp
similarity index 76%
rename from src/armnn/SubGraph.hpp
rename to src/armnn/SubgraphView.hpp
index cb44f8c..b211ad4 100644
--- a/src/armnn/SubGraph.hpp
+++ b/src/armnn/SubgraphView.hpp
@@ -15,15 +15,15 @@
 {
 
 ///
-/// The SubGraph class represents a subgraph of a Graph.
+/// The SubgraphView class represents a subgraph of a Graph.
 /// The data it holds, points to data held by layers of the Graph, so the
-/// the contents of the SubGraph becomes invalid when the Layers are destroyed
+/// the contents of the SubgraphView becomes invalid when the Layers are destroyed
 /// or changed.
 ///
-class SubGraph final
+class SubgraphView final
 {
 public:
-    using SubGraphPtr = std::unique_ptr<SubGraph>;
+    using SubgraphViewPtr = std::unique_ptr<SubgraphView>;
     using InputSlots = std::vector<InputSlot*>;
     using OutputSlots = std::vector<OutputSlot*>;
     using Layers = std::list<Layer*>;
@@ -31,27 +31,27 @@
     using ConstIterator = Layers::const_iterator;
 
     /// Empty subgraphs are not allowed, they must at least have a parent graph.
-    SubGraph() = delete;
+    SubgraphView() = delete;
 
     /// Constructs a sub-graph from the entire given graph.
-    SubGraph(Graph& graph);
+    SubgraphView(Graph& graph);
 
     /// Constructs a sub-graph with the given arguments and binds it to the specified parent graph.
-    SubGraph(Graph* parentGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers);
+    SubgraphView(Graph* parentGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers);
 
     /// Constructs a sub-graph with the given arguments and uses the specified sub-graph to get a reference
     /// to the parent graph.
-    SubGraph(const SubGraph& referenceSubGraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers);
+    SubgraphView(const SubgraphView& referenceSubgraph, InputSlots&& inputs, OutputSlots&& outputs, Layers&& layers);
 
     /// Copy-constructor.
-    SubGraph(const SubGraph& subGraph);
+    SubgraphView(const SubgraphView& subgraph);
 
     /// Move-constructor.
-    SubGraph(SubGraph&& subGraph);
+    SubgraphView(SubgraphView&& subgraph);
 
     /// Constructs a sub-graph with only the given layer and uses the specified sub-graph to get a reference
     /// to the parent graph.
-    SubGraph(const SubGraph& referenceSubGraph, IConnectableLayer* layer);
+    SubgraphView(const SubgraphView& referenceSubgraph, IConnectableLayer* layer);
 
     /// Updates this sub-graph with the contents of the whole given graph.
     void Update(Graph& graph);
@@ -83,7 +83,7 @@
     ConstIterator cend() const;
 
 private:
-    void CheckSubGraph();
+    void CheckSubgraph();
 
     /// The list of pointers to the input slots of the parent graph.
     InputSlots m_InputSlots;
@@ -99,7 +99,7 @@
 };
 
 template <typename LayerT, typename... Args>
-LayerT* SubGraph::AddLayer(Args&&... args) const
+LayerT* SubgraphView::AddLayer(Args&&... args) const
 {
     BOOST_ASSERT(m_ParentGraph);
 
diff --git a/src/armnn/SubGraphSelector.cpp b/src/armnn/SubgraphViewSelector.cpp
similarity index 79%
rename from src/armnn/SubGraphSelector.cpp
rename to src/armnn/SubgraphViewSelector.cpp
index be51a7d..7663c31 100644
--- a/src/armnn/SubGraphSelector.cpp
+++ b/src/armnn/SubgraphViewSelector.cpp
@@ -3,7 +3,7 @@
 // SPDX-License-Identifier: MIT
 //
 
-#include "SubGraphSelector.hpp"
+#include "SubgraphViewSelector.hpp"
 #include "Graph.hpp"
 #include <boost/assert.hpp>
 #include <algorithm>
@@ -20,7 +20,7 @@
     using LayerInfoContainer = std::unordered_map<Layer*, LayerSelectionInfo>;
     static constexpr uint32_t InitialSplitId() { return 1; }
 
-    LayerSelectionInfo(Layer* layer, const SubGraphSelector::LayerSelectorFunction& selector)
+    LayerSelectionInfo(Layer* layer, const SubgraphViewSelector::LayerSelectorFunction& selector)
     : m_Layer{layer}
     , m_SplitId{0}
     , m_IsSelected{selector(*layer)}
@@ -76,8 +76,8 @@
         return m_Layer->GetType() == armnn::LayerType::Input;
     }
 
-    void CollectNonSelectedInputs(SubGraph::InputSlots& inputSlots,
-                                  const SubGraphSelector::LayerSelectorFunction& selector)
+    void CollectNonSelectedInputs(SubgraphView::InputSlots& inputSlots,
+                                  const SubgraphViewSelector::LayerSelectorFunction& selector)
     {
         for (auto&& slot = m_Layer->BeginInputSlots(); slot != m_Layer->EndInputSlots(); ++slot)
         {
@@ -94,8 +94,8 @@
         }
     }
 
-    void CollectNonSelectedOutputSlots(SubGraph::OutputSlots& outputSlots,
-                                       const SubGraphSelector::LayerSelectorFunction& selector)
+    void CollectNonSelectedOutputSlots(SubgraphView::OutputSlots& outputSlots,
+                                       const SubgraphViewSelector::LayerSelectorFunction& selector)
     {
         for (auto&& slot = m_Layer->BeginOutputSlots(); slot != m_Layer->EndOutputSlots(); ++slot)
         {
@@ -119,19 +119,19 @@
 
 } // namespace <anonymous>
 
-SubGraphSelector::SubGraphs
-SubGraphSelector::SelectSubGraphs(Graph& graph, const LayerSelectorFunction& selector)
+SubgraphViewSelector::Subgraphs
+SubgraphViewSelector::SelectSubgraphs(Graph& graph, const LayerSelectorFunction& selector)
 {
-    SubGraph subGraph(graph);
-    return SubGraphSelector::SelectSubGraphs(subGraph, selector);
+    SubgraphView subgraph(graph);
+    return SubgraphViewSelector::SelectSubgraphs(subgraph, selector);
 }
 
-SubGraphSelector::SubGraphs
-SubGraphSelector::SelectSubGraphs(SubGraph& subGraph, const LayerSelectorFunction& selector)
+SubgraphViewSelector::Subgraphs
+SubgraphViewSelector::SelectSubgraphs(SubgraphView& subgraph, const LayerSelectorFunction& selector)
 {
     LayerSelectionInfo::LayerInfoContainer layerInfo;
 
-    for (auto& layer : subGraph)
+    for (auto& layer : subgraph)
     {
         layerInfo.emplace(layer, LayerSelectionInfo{layer, selector});
     }
@@ -168,14 +168,14 @@
     }
 
     // Now each non-empty split id represents a subgraph
-    SubGraphs result;
+    Subgraphs result;
     for (auto& splitGraph : splitMap)
     {
         if (splitGraph.second.empty() == false)
         {
-            SubGraph::InputSlots inputs;
-            SubGraph::OutputSlots outputs;
-            SubGraph::Layers layers;
+            SubgraphView::InputSlots inputs;
+            SubgraphView::OutputSlots outputs;
+            SubgraphView::Layers layers;
             for (auto&& infoPtr : splitGraph.second)
             {
                 infoPtr->CollectNonSelectedInputs(inputs, selector);
@@ -184,10 +184,10 @@
             }
             // Create a new sub-graph with the new lists of input/output slots and layer, using
             // the given sub-graph as a reference of which parent graph to use
-            result.emplace_back(std::make_unique<SubGraph>(subGraph,
-                                                           std::move(inputs),
-                                                           std::move(outputs),
-                                                           std::move(layers)));
+            result.emplace_back(std::make_unique<SubgraphView>(subgraph,
+                                                               std::move(inputs),
+                                                               std::move(outputs),
+                                                               std::move(layers)));
         }
     }
 
diff --git a/src/armnn/SubgraphViewSelector.hpp b/src/armnn/SubgraphViewSelector.hpp
new file mode 100644
index 0000000..9d881fa
--- /dev/null
+++ b/src/armnn/SubgraphViewSelector.hpp
@@ -0,0 +1,38 @@
+//
+// Copyright © 2017 Arm Ltd. All rights reserved.
+// SPDX-License-Identifier: MIT
+//
+#pragma once
+
+#include "SubgraphView.hpp"
+#include <functional>
+#include <memory>
+
+namespace armnn
+{
+
+class Layer;
+class Graph;
+
+class SubgraphViewSelector final
+{
+public:
+    using SubgraphViewPtr = std::unique_ptr<SubgraphView>;
+    using Subgraphs = std::vector<SubgraphViewPtr>;
+    using LayerSelectorFunction = std::function<bool(const Layer&)>;
+
+    /// Selects subgraphs from a graph based on the selector function and the algorithm.
+    /// Since the Subgraphs object returns modifiable pointers to the input and output slots of the graph:
+    ///  1) the graph/sub-graph cannot be const
+    ///  2) the caller needs to make sure that the Subgraphs lifetime is shorter than the parent graph's
+    static Subgraphs SelectSubgraphs(Graph& graph, const LayerSelectorFunction& selector);
+    static Subgraphs SelectSubgraphs(SubgraphView& subgraph, const LayerSelectorFunction& selector);
+
+private:
+    // this is a utility class, don't construct or copy
+    SubgraphViewSelector() = delete;
+    SubgraphViewSelector(const SubgraphViewSelector&) = delete;
+    SubgraphViewSelector & operator=(const SubgraphViewSelector&) = delete;
+};
+
+} // namespace armnn
diff --git a/src/armnn/layers/PreCompiledLayer.cpp b/src/armnn/layers/PreCompiledLayer.cpp
index 29b3514..963924d 100644
--- a/src/armnn/layers/PreCompiledLayer.cpp
+++ b/src/armnn/layers/PreCompiledLayer.cpp
@@ -38,7 +38,7 @@
 
 void PreCompiledLayer::ValidateTensorShapesFromInputs()
 {
-    // NOTE: since the PreCompiledLayer is an internal layer created from a valid SubGraph,
+    // NOTE: since the PreCompiledLayer is an internal layer created from a valid SubgraphView,
     // we do not need to validate its input shapes
 }
 
diff --git a/src/armnn/test/SubGraphTests.cpp b/src/armnn/test/SubgraphViewTests.cpp
similarity index 71%
rename from src/armnn/test/SubGraphTests.cpp
rename to src/armnn/test/SubgraphViewTests.cpp
index e5b444a..603bb15 100644
--- a/src/armnn/test/SubGraphTests.cpp
+++ b/src/armnn/test/SubgraphViewTests.cpp
@@ -7,8 +7,8 @@
 #include <armnn/ArmNN.hpp>
 
 #include <Graph.hpp>
-#include <SubGraph.hpp>
-#include <SubGraphSelector.hpp>
+#include <SubgraphView.hpp>
+#include <SubgraphViewSelector.hpp>
 
 #include <backendsCommon/CpuTensorHandle.hpp>
 
@@ -17,9 +17,9 @@
 namespace
 {
 
-bool AreAnySubGraphLayersPresentInGraph(const SubGraph::Layers &subGraphLayers, const Graph &graph)
+bool AreAnySubgraphLayersPresentInGraph(const SubgraphView::Layers &subgraphLayers, const Graph &graph)
 {
-    for(auto&& layer : subGraphLayers)
+    for(auto&& layer : subgraphLayers)
     {
         auto posInGraph = std::find(graph.begin(), graph.end(), layer);
         if(posInGraph != graph.end())
@@ -34,9 +34,9 @@
 //
 // this helper only works if all layers where the inputs connect to are not selected
 //
-SubGraph::InputSlots CreateInputsFrom(const std::vector<Layer*>& layers)
+SubgraphView::InputSlots CreateInputsFrom(const std::vector<Layer*>& layers)
 {
-    SubGraph::InputSlots result;
+    SubgraphView::InputSlots result;
     for (auto&& layer : layers)
     {
         for (auto&& it = layer->BeginInputSlots(); it != layer->EndInputSlots(); ++it)
@@ -50,9 +50,9 @@
 //
 // this helper only works if all layers where the outputs connect to are not selected
 //
-SubGraph::OutputSlots CreateOutputsFrom(const std::vector<Layer*>& layers)
+SubgraphView::OutputSlots CreateOutputsFrom(const std::vector<Layer*>& layers)
 {
-    SubGraph::OutputSlots result;
+    SubgraphView::OutputSlots result;
     for (auto && layer : layers)
     {
         for (auto&& it = layer->BeginOutputSlots(); it != layer->EndOutputSlots(); ++it)
@@ -67,12 +67,12 @@
 // this takes the inputs, outputs and layers as a copy and the move these copies into the
 // resulting subgraph, so the pass bay value is intentional
 //
-SubGraphSelector::SubGraphPtr CreateSubGraphFrom(Graph& graph,
-                                                 SubGraph::InputSlots&& inputs,
-                                                 SubGraph::OutputSlots&& outputs,
-                                                 SubGraph::Layers&& layers)
+SubgraphViewSelector::SubgraphViewPtr CreateSubgraphViewFrom(Graph& graph,
+                                                             SubgraphView::InputSlots&& inputs,
+                                                             SubgraphView::OutputSlots&& outputs,
+                                                             SubgraphView::Layers&& layers)
 {
-    return std::make_unique<SubGraph>(&graph, std::move(inputs), std::move(outputs), std::move(layers));
+    return std::make_unique<SubgraphView>(&graph, std::move(inputs), std::move(outputs), std::move(layers));
 }
 
 template <typename T, typename Iterator>
@@ -84,13 +84,13 @@
 }
 
 template <typename T>
-void CompareVectors(const std::vector<T> & result, const std::vector<T> & expected)
+void CompareVectors(const std::vector<T>& result, const std::vector<T>& expected)
 {
     BOOST_CHECK_EQUAL_COLLECTIONS(result.begin(), result.end(), expected.begin(), expected.end());
 }
 
-void CompareSubGraphs(SubGraphSelector::SubGraphPtr & result,
-                      SubGraphSelector::SubGraphPtr & expected)
+void CompareSubgraphViews(SubgraphViewSelector::SubgraphViewPtr& result,
+                          SubgraphViewSelector::SubgraphViewPtr& expected)
 {
     // expect both to be valid subgraphs
     BOOST_TEST((result.get() != nullptr));
@@ -127,7 +127,7 @@
 
 } // namespace <anonymous>
 
-BOOST_AUTO_TEST_SUITE(SubGraphSubstitution)
+BOOST_AUTO_TEST_SUITE(SubgraphSubstitution)
 
 BOOST_AUTO_TEST_CASE(SingleInputSingleOutput)
 {
@@ -147,25 +147,25 @@
     convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // Construct sub-graph
-    SubGraphSelector::SubGraphPtr subGraph = CreateSubGraphFrom(graph,
-                                                                CreateInputsFrom({convLayer1}),
-                                                                CreateOutputsFrom({convLayer2}),
-                                                                {});
+    SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(graph,
+                                                                            CreateInputsFrom({convLayer1}),
+                                                                            CreateOutputsFrom({convLayer2}),
+                                                                            {});
 
     // Save sub-graph connections for comparison after substitution
-    IOutputSlot* subGraphInputConn = subGraph->GetInputSlot(0)->GetConnection();
-    IInputSlot* subGraphOutputConn = subGraph->GetOutputSlot(0)->GetConnection(0);
+    IOutputSlot* subgraphInputConn = subgraph->GetInputSlot(0)->GetConnection();
+    IInputSlot* subgraphOutputConn = subgraph->GetOutputSlot(0)->GetConnection(0);
 
     // Construct dummy pre-compiled layer
     PreCompiledDescriptor preCompiledDescriptor(1, 1);
     Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
     // Substitute sub-graph with pre-compiled layer
-    graph.SubstituteSubGraph(std::move(subGraph), preCompiledLayer);
+    graph.SubstituteSubgraph(std::move(subgraph), preCompiledLayer);
 
     // Check that connections are correct after substitution
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subGraphInputConn);
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subGraphOutputConn);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subgraphInputConn);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subgraphOutputConn);
 }
 
 BOOST_AUTO_TEST_CASE(MultiInputSingleOutput)
@@ -195,29 +195,29 @@
     mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // Construct sub-graph
-    SubGraphSelector::SubGraphPtr subGraph = CreateSubGraphFrom(graph,
-                                                                CreateInputsFrom({convLayer1, convLayer2}),
-                                                                CreateOutputsFrom({mergerLayer}),
-                                                                {});
+    SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(graph,
+                                                                            CreateInputsFrom({convLayer1, convLayer2}),
+                                                                            CreateOutputsFrom({mergerLayer}),
+                                                                            {});
 
     // Save sub-graph connections for comparison after substitution
-    IOutputSlot* subGraphInputConn1 = subGraph->GetInputSlot(0)->GetConnection();
-    IOutputSlot* subGraphInputConn2 = subGraph->GetInputSlot(1)->GetConnection();
+    IOutputSlot* subgraphInputConn1 = subgraph->GetInputSlot(0)->GetConnection();
+    IOutputSlot* subgraphInputConn2 = subgraph->GetInputSlot(1)->GetConnection();
 
-    IInputSlot* subGraphOutputConn = subGraph->GetOutputSlot(0)->GetConnection(0);
+    IInputSlot* subgraphOutputConn = subgraph->GetOutputSlot(0)->GetConnection(0);
 
     // Construct dummy pre-compiled layer
     PreCompiledDescriptor preCompiledDescriptor(2, 1);
     Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
     // Substitute sub-graph with pre-compiled layer
-    graph.SubstituteSubGraph(std::move(subGraph), preCompiledLayer);
+    graph.SubstituteSubgraph(std::move(subgraph), preCompiledLayer);
 
     // Check that connections are correct after substitution
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subGraphInputConn1);
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(1).GetConnection(), subGraphInputConn2);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subgraphInputConn1);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(1).GetConnection(), subgraphInputConn2);
 
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subGraphOutputConn);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subgraphOutputConn);
 }
 
 BOOST_AUTO_TEST_CASE(SingleInputMultiOutput)
@@ -245,29 +245,29 @@
     mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // Construct sub-graph
-    SubGraphSelector::SubGraphPtr subGraph = CreateSubGraphFrom(graph,
-                                                                CreateInputsFrom({splitterLayer}),
-                                                                CreateOutputsFrom({convLayer1, convLayer2}),
-                                                                {});
+    SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(graph,
+                                                                            CreateInputsFrom({splitterLayer}),
+                                                                            CreateOutputsFrom({convLayer1, convLayer2}),
+                                                                            {});
 
     // Save sub-graph connections for comparison after substitution
-    IOutputSlot* subGraphInputConn1 = subGraph->GetInputSlot(0)->GetConnection();
+    IOutputSlot* subgraphInputConn1 = subgraph->GetInputSlot(0)->GetConnection();
 
-    IInputSlot* subGraphOutputConn1 = subGraph->GetOutputSlot(0)->GetConnection(0);
-    IInputSlot* subGraphOutputConn2 = subGraph->GetOutputSlot(1)->GetConnection(0);
+    IInputSlot* subgraphOutputConn1 = subgraph->GetOutputSlot(0)->GetConnection(0);
+    IInputSlot* subgraphOutputConn2 = subgraph->GetOutputSlot(1)->GetConnection(0);
 
     // Construct dummy pre-compiled layer
     PreCompiledDescriptor preCompiledDescriptor(1, 2);
     Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
     // Substitute sub-graph with pre-compiled layer
-    graph.SubstituteSubGraph(std::move(subGraph), preCompiledLayer);
+    graph.SubstituteSubgraph(std::move(subgraph), preCompiledLayer);
 
     // Check that connections are correct after substitution
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subGraphInputConn1);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subgraphInputConn1);
 
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subGraphOutputConn1);
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(1).GetConnection(0), subGraphOutputConn2);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subgraphOutputConn1);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(1).GetConnection(0), subgraphOutputConn2);
 }
 
 BOOST_AUTO_TEST_CASE(MultiInputMultiOutput)
@@ -297,31 +297,31 @@
     mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // Construct sub-graph
-    SubGraphSelector::SubGraphPtr subGraph = CreateSubGraphFrom(graph,
-                                                                CreateInputsFrom({convLayer1, convLayer2}),
-                                                                CreateOutputsFrom({convLayer1, convLayer2}),
-                                                                {});
+    SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(graph,
+                                                                            CreateInputsFrom({convLayer1, convLayer2}),
+                                                                            CreateOutputsFrom({convLayer1, convLayer2}),
+                                                                            {});
 
     // Save sub-graph connections for comparison after substitution
-    IOutputSlot* subGraphInputConn1 = subGraph->GetInputSlot(0)->GetConnection();
-    IOutputSlot* subGraphInputConn2 = subGraph->GetInputSlot(1)->GetConnection();
+    IOutputSlot* subgraphInputConn1 = subgraph->GetInputSlot(0)->GetConnection();
+    IOutputSlot* subgraphInputConn2 = subgraph->GetInputSlot(1)->GetConnection();
 
-    IInputSlot* subGraphOutputConn1 = subGraph->GetOutputSlot(0)->GetConnection(0);
-    IInputSlot* subGraphOutputConn2 = subGraph->GetOutputSlot(1)->GetConnection(0);
+    IInputSlot* subgraphOutputConn1 = subgraph->GetOutputSlot(0)->GetConnection(0);
+    IInputSlot* subgraphOutputConn2 = subgraph->GetOutputSlot(1)->GetConnection(0);
 
     // Construct dummy pre-compiled layer
     PreCompiledDescriptor preCompiledDescriptor(2, 2);
     Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
     // Substitute sub-graph with pre-compiled layer
-    graph.SubstituteSubGraph(std::move(subGraph), preCompiledLayer);
+    graph.SubstituteSubgraph(std::move(subgraph), preCompiledLayer);
 
     // Check that connections are correct after substitution
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subGraphInputConn1);
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(1).GetConnection(), subGraphInputConn2);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subgraphInputConn1);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(1).GetConnection(), subgraphInputConn2);
 
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subGraphOutputConn1);
-    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(1).GetConnection(0), subGraphOutputConn2);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subgraphOutputConn1);
+    BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(1).GetConnection(0), subgraphOutputConn2);
 }
 
 BOOST_AUTO_TEST_CASE(EraseReplacedLayers)
@@ -344,40 +344,43 @@
     graph.AddLayer<OutputLayer>(0, "output");
 
     // Construct sub-graph
-    SubGraphSelector::SubGraphPtr subGraph = CreateSubGraphFrom(graph,
-                                                                {},
-                                                                {},
-                                                                {splitterLayer, convLayer1, convLayer2, mergerLayer});
+    SubgraphViewSelector::SubgraphViewPtr subgraph = CreateSubgraphViewFrom(graph,
+                                                                            {},
+                                                                            {},
+                                                                            {splitterLayer,
+                                                                             convLayer1,
+                                                                             convLayer2,
+                                                                             mergerLayer});
 
     // Construct dummy pre-compiled layer
     PreCompiledDescriptor preCompiledDescriptor(0, 0);
     Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
     // Save sub-graph layers for later verification
-    const SubGraph::Layers subGraphLayers = subGraph->GetLayers();
+    const SubgraphView::Layers subgraphLayers = subgraph->GetLayers();
 
     // Substitute sub-graph with pre-compiled layer
-    graph.SubstituteSubGraph(std::move(subGraph), preCompiledLayer);
+    graph.SubstituteSubgraph(std::move(subgraph), preCompiledLayer);
 
     // Check that the layers belonging to the sub-graph have been erased from the graph after substitution
-    BOOST_CHECK(!AreAnySubGraphLayersPresentInGraph(subGraphLayers, graph));
+    BOOST_CHECK(!AreAnySubgraphLayersPresentInGraph(subgraphLayers, graph));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
 
-BOOST_AUTO_TEST_SUITE(SubGraphSelection)
+BOOST_AUTO_TEST_SUITE(SubgraphSelection)
 
-BOOST_AUTO_TEST_CASE(SubGraphForEmptyGraph)
+BOOST_AUTO_TEST_CASE(SubgraphForEmptyGraph)
 {
     Graph graph;
-    SubGraph subGraph(graph);
+    SubgraphView subgraph(graph);
 
-    BOOST_TEST(subGraph.GetInputSlots().empty());
-    BOOST_TEST(subGraph.GetOutputSlots().empty());
-    BOOST_TEST(subGraph.GetLayers().empty());
+    BOOST_TEST(subgraph.GetInputSlots().empty());
+    BOOST_TEST(subgraph.GetOutputSlots().empty());
+    BOOST_TEST(subgraph.GetLayers().empty());
 }
 
-BOOST_AUTO_TEST_CASE(SubGraphForEntireGraph)
+BOOST_AUTO_TEST_CASE(SubgraphForEntireGraph)
 {
     Graph graph;
 
@@ -390,35 +393,35 @@
                                                       "mid1");
     graph.InsertNewLayer<InputLayer>(mid1->GetInputSlot(0), 0, "input");
 
-    SubGraph subGraph(graph);
+    SubgraphView subgraph(graph);
 
-    BOOST_TEST(subGraph.GetInputSlots().empty());
-    BOOST_TEST(subGraph.GetOutputSlots().empty());
-    BOOST_TEST(subGraph.GetLayers().size() == graph.GetNumLayers());
+    BOOST_TEST(subgraph.GetInputSlots().empty());
+    BOOST_TEST(subgraph.GetOutputSlots().empty());
+    BOOST_TEST(subgraph.GetLayers().size() == graph.GetNumLayers());
 }
 
-BOOST_AUTO_TEST_CASE(NoSubGraphsForNoMatch)
+BOOST_AUTO_TEST_CASE(NoSubgraphsForNoMatch)
 {
     Graph graph;
 
     auto output = graph.AddLayer<OutputLayer>(0, "output");
     graph.InsertNewLayer<InputLayer>(output->GetInputSlot(0), 0, "input");
 
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(graph, [](const Layer &) { return false; });
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(graph, [](const Layer &) { return false; });
 
-    BOOST_TEST(subGraphs.empty());
+    BOOST_TEST(subgraphs.empty());
 }
 
-BOOST_AUTO_TEST_CASE(OneSubGraphsSelectedASingleMatch)
+BOOST_AUTO_TEST_CASE(OneSubgraphsSelectedASingleMatch)
 {
     Graph graph;
 
     auto output = graph.AddLayer<OutputLayer>(0, "output");
     graph.InsertNewLayer<InputLayer>(output->GetInputSlot(0), 0, "input");
 
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the output layer only
             [](const Layer & l)
@@ -427,16 +430,16 @@
                 return isOutput;
             });
 
-    BOOST_TEST(subGraphs.size() == 1);
-    if (subGraphs.size() == 1)
+    BOOST_TEST(subgraphs.size() == 1);
+    if (subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({output}),
-                                           // outputs of 'output' will be empty
-                                           CreateOutputsFrom({output}),
-                                           {output});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({output}),
+                                               // outputs of 'output' will be empty
+                                               CreateOutputsFrom({output}),
+                                               {output});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -453,8 +456,8 @@
                                                       "mid1");
     graph.InsertNewLayer<InputLayer>(mid1->GetInputSlot(0), 0, "input");
 
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the middle layers only
             [](const Layer & l)
@@ -463,15 +466,15 @@
                 return toSelect;
             });
 
-    BOOST_TEST(subGraphs.size() == 1);
-    if (subGraphs.size() == 1)
+    BOOST_TEST(subgraphs.size() == 1);
+    if (subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({mid1}),
-                                           CreateOutputsFrom({mid0}),
-                                           {mid1, mid0});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({mid1}),
+                                               CreateOutputsFrom({mid0}),
+                                               {mid1, mid0});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -527,8 +530,8 @@
     x0->GetOutputSlot(0).Connect(m4->GetInputSlot(0));
 
     // All selected 'M*' layers will be of Activation type
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the middle layers only
             [](const Layer & l)
@@ -538,44 +541,44 @@
             });
 
     // expected results to test against
-    auto largerSubGraph = CreateSubGraphFrom(graph,
-                                             CreateInputsFrom({m1, m4}),
-                                             CreateOutputsFrom({m3, m4}),
-                                             {m1, m4, m2, m3});
+    auto largerSubgraph = CreateSubgraphViewFrom(graph,
+                                                 CreateInputsFrom({m1, m4}),
+                                                 CreateOutputsFrom({m3, m4}),
+                                                 {m1, m4, m2, m3});
 
-    auto smallerSubGraph = CreateSubGraphFrom(graph,
-                                              CreateInputsFrom({m5}),
-                                              CreateOutputsFrom({m5}),
-                                              {m5});
+    auto smallerSubgraph = CreateSubgraphViewFrom(graph,
+                                                  CreateInputsFrom({m5}),
+                                                  CreateOutputsFrom({m5}),
+                                                  {m5});
 
-    BOOST_TEST(subGraphs.size() == 2);
-    if (subGraphs.size() == 2)
+    BOOST_TEST(subgraphs.size() == 2);
+    if (subgraphs.size() == 2)
     {
         // we need to have valid subgraph pointers here
-        BOOST_TEST((subGraphs[0] != nullptr));
-        BOOST_TEST((subGraphs[1] != nullptr));
+        BOOST_TEST((subgraphs[0] != nullptr));
+        BOOST_TEST((subgraphs[1] != nullptr));
 
-        if (subGraphs[0].get() != nullptr && subGraphs[1].get() != nullptr)
+        if (subgraphs[0].get() != nullptr && subgraphs[1].get() != nullptr)
         {
             // sort the subgraphs by layer size, so it is simpler to test
-            std::sort(subGraphs.begin(), subGraphs.end(),
-                [](SubGraphSelector::SubGraphPtr & lhs, SubGraphSelector::SubGraphPtr & rhs)
+            std::sort(subgraphs.begin(), subgraphs.end(),
+                [](SubgraphViewSelector::SubgraphViewPtr & lhs, SubgraphViewSelector::SubgraphViewPtr & rhs)
                 {
                     return (lhs->GetLayers().size() < rhs->GetLayers().size());
                 }
             );
 
             // one subgraph needs to be size=1 and the other one is 4
-            BOOST_TEST(subGraphs[0]->GetLayers().size() == 1);
-            BOOST_TEST(subGraphs[1]->GetLayers().size() == 4);
+            BOOST_TEST(subgraphs[0]->GetLayers().size() == 1);
+            BOOST_TEST(subgraphs[1]->GetLayers().size() == 4);
 
-            CompareSubGraphs(subGraphs[0], smallerSubGraph);
-            CompareSubGraphs(subGraphs[1], largerSubGraph);
+            CompareSubgraphViews(subgraphs[0], smallerSubgraph);
+            CompareSubgraphViews(subgraphs[1], largerSubgraph);
         }
     }
 }
 
-BOOST_AUTO_TEST_CASE(MultipleSimpleSubGraphs)
+BOOST_AUTO_TEST_CASE(MultipleSimpleSubgraphs)
 {
     // This test case represents the scenario when we have two distinct subgraphs
     // in a simple linear network. The selected nodes are the M* and the
@@ -605,8 +608,8 @@
     graph.InsertNewLayer<InputLayer>(m1->GetInputSlot(0), 0, "x1");
 
     // All selected 'M*' layers will be of Activation type
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the middle layers only
             [](const Layer & l)
@@ -616,38 +619,38 @@
             });
 
     // expected results to test against
-    auto largerSubGraph = CreateSubGraphFrom(graph,
-                                             CreateInputsFrom({m1}),
-                                             CreateOutputsFrom({m2}),
-                                             {m1, m2});
+    auto largerSubgraph = CreateSubgraphViewFrom(graph,
+                                                 CreateInputsFrom({m1}),
+                                                 CreateOutputsFrom({m2}),
+                                                 {m1, m2});
 
-    auto smallerSubGraph = CreateSubGraphFrom(graph,
-                                              CreateInputsFrom({m3}),
-                                              CreateOutputsFrom({m3}),
-                                              {m3});
+    auto smallerSubgraph = CreateSubgraphViewFrom(graph,
+                                                  CreateInputsFrom({m3}),
+                                                  CreateOutputsFrom({m3}),
+                                                  {m3});
 
-    BOOST_TEST(subGraphs.size() == 2);
-    if (subGraphs.size() == 2)
+    BOOST_TEST(subgraphs.size() == 2);
+    if (subgraphs.size() == 2)
     {
         // we need to have valid subgraph pointers here
-        BOOST_TEST((subGraphs[0] != nullptr));
-        BOOST_TEST((subGraphs[1] != nullptr));
+        BOOST_TEST((subgraphs[0] != nullptr));
+        BOOST_TEST((subgraphs[1] != nullptr));
 
-        if (subGraphs[0].get() != nullptr && subGraphs[1].get() != nullptr)
+        if (subgraphs[0].get() != nullptr && subgraphs[1].get() != nullptr)
         {
             // sort the subgraphs by layer size, so it is simpler to test
-            std::sort(subGraphs.begin(), subGraphs.end(),
-                [](SubGraphSelector::SubGraphPtr & lhs, SubGraphSelector::SubGraphPtr & rhs)
+            std::sort(subgraphs.begin(), subgraphs.end(),
+                [](SubgraphViewSelector::SubgraphViewPtr & lhs, SubgraphViewSelector::SubgraphViewPtr & rhs)
                 {
                     return (lhs->GetLayers().size() < rhs->GetLayers().size());
                 }
             );
 
-            BOOST_TEST(subGraphs[0]->GetLayers().size() == 1);
-            BOOST_TEST(subGraphs[1]->GetLayers().size() == 2);
+            BOOST_TEST(subgraphs[0]->GetLayers().size() == 1);
+            BOOST_TEST(subgraphs[1]->GetLayers().size() == 2);
 
-            CompareSubGraphs(subGraphs[0], smallerSubGraph);
-            CompareSubGraphs(subGraphs[1], largerSubGraph);
+            CompareSubgraphViews(subgraphs[0], smallerSubgraph);
+            CompareSubgraphViews(subgraphs[1], largerSubgraph);
         }
     }
 }
@@ -677,8 +680,8 @@
     layerM1->GetOutputSlot(0).Connect(layerM2->GetInputSlot(0));
     layerM2->GetOutputSlot(0).Connect(layerX2->GetInputSlot(0));
 
-    SubGraphSelector::SubGraphs subGraphs =
-            SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+            SubgraphViewSelector::SelectSubgraphs(
                     graph,
                     // select the activation layers M1 and M2
                     [](const Layer & l)
@@ -687,15 +690,15 @@
                         return toSelect;
                     });
 
-    BOOST_CHECK(subGraphs.size() == 1);
-    if(subGraphs.size() == 1)
+    BOOST_CHECK(subgraphs.size() == 1);
+    if(subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({layerM1}),
-                                           CreateOutputsFrom({layerM2}),
-                                           {layerM1, layerM2});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({layerM1}),
+                                               CreateOutputsFrom({layerM2}),
+                                               {layerM1, layerM2});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -732,8 +735,8 @@
     layerM2->GetOutputSlot(0).Connect(layerM3->GetInputSlot(1));
     layerM3->GetOutputSlot(0).Connect(layerX3->GetInputSlot(0));
 
-    SubGraphSelector::SubGraphs subGraphs =
-            SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+            SubgraphViewSelector::SelectSubgraphs(
                     graph,
                     // select Activation and Addition Layers M1, M2 and M3
                     [](const Layer & l)
@@ -743,15 +746,15 @@
                         return toSelect;
                     });
 
-    BOOST_CHECK(subGraphs.size() == 1);
-    if (subGraphs.size() == 1)
+    BOOST_CHECK(subgraphs.size() == 1);
+    if (subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({layerM1, layerM2}),
-                                           CreateOutputsFrom({layerM3}),
-                                           {layerM1, layerM2, layerM3});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({layerM1, layerM2}),
+                                               CreateOutputsFrom({layerM3}),
+                                               {layerM1, layerM2, layerM3});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -789,8 +792,8 @@
     layerM2->GetOutputSlot(0).Connect(layerX2->GetInputSlot(0));
     layerM3->GetOutputSlot(0).Connect(layerX3->GetInputSlot(0));
 
-    SubGraphSelector::SubGraphs subGraphs =
-            SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+            SubgraphViewSelector::SelectSubgraphs(
                     graph,
                     // select Activation and Splitter Layers M1, M2 and M3
                     [](const Layer & l)
@@ -800,15 +803,15 @@
                         return toSelect;
                     });
 
-    BOOST_CHECK(subGraphs.size() == 1);
-    if(subGraphs.size() == 1)
+    BOOST_CHECK(subgraphs.size() == 1);
+    if(subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({layerM1}),
-                                           CreateOutputsFrom({layerM2, layerM3}),
-                                           {layerM1, layerM2, layerM3});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({layerM1}),
+                                               CreateOutputsFrom({layerM2, layerM3}),
+                                               {layerM1, layerM2, layerM3});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -853,8 +856,8 @@
     m5->GetOutputSlot(0).Connect(x4->GetInputSlot(0));
 
 
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select Activation and Merger Layers M1, M2, M3, M4, M5
             [](const Layer & l)
@@ -865,15 +868,15 @@
             });
 
 
-    BOOST_CHECK(subGraphs.size() == 1);
-    if (subGraphs.size() == 1)
+    BOOST_CHECK(subgraphs.size() == 1);
+    if (subgraphs.size() == 1)
     {
-        auto expected = CreateSubGraphFrom(graph,
-                                           CreateInputsFrom({m1, m2}),
-                                           CreateOutputsFrom({m4, m5}),
-                                           {m1, m2, m3, m4, m5});
+        auto expected = CreateSubgraphViewFrom(graph,
+                                               CreateInputsFrom({m1, m2}),
+                                               CreateOutputsFrom({m4, m5}),
+                                               {m1, m2, m3, m4, m5});
 
-        CompareSubGraphs(subGraphs[0], expected);
+        CompareSubgraphViews(subgraphs[0], expected);
     }
 }
 
@@ -881,7 +884,7 @@
 
 BOOST_AUTO_TEST_SUITE(IntegrationTests)
 
-BOOST_AUTO_TEST_CASE(SingleSubGraph)
+BOOST_AUTO_TEST_CASE(SingleSubgraph)
 {
     // This test case represents the scenario when we have one subgraph
     // in which two layers have GpuAcc backend assigned
@@ -905,8 +908,8 @@
     convLayer2->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // GpuAcc sub graph selector
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the GpuAcc layers only
             [](const Layer & l){
@@ -914,39 +917,39 @@
                 return toSelect;
             });
 
-    BOOST_TEST(subGraphs.size() == 1);
-    if(subGraphs.size() == 1)
+    BOOST_TEST(subgraphs.size() == 1);
+    if(subgraphs.size() == 1)
     {
-        BOOST_TEST((subGraphs[0] != nullptr));
+        BOOST_TEST((subgraphs[0] != nullptr));
 
-        if (subGraphs[0].get() != nullptr)
+        if (subgraphs[0].get() != nullptr)
         {
-            unsigned int numInputSlots = boost::numeric_cast<unsigned int>(subGraphs[0]->GetInputSlots().size());
-            unsigned int numOutputSlots = boost::numeric_cast<unsigned int>(subGraphs[0]->GetOutputSlots().size());
+            unsigned int numInputSlots = boost::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
+            unsigned int numOutputSlots = boost::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
 
             BOOST_TEST((numInputSlots == 1));
             BOOST_TEST((numOutputSlots == 1));
 
             // Save sub-graph connections for comparison after substitution
-            IOutputSlot* subGraphInputConn1 = subGraphs[0]->GetInputSlot(0)->GetConnection();
-            IInputSlot* subGraphOutputConn1 = subGraphs[0]->GetOutputSlot(0)->GetConnection(0);
+            IOutputSlot* subgraphInputConn1 = subgraphs[0]->GetInputSlot(0)->GetConnection();
+            IInputSlot* subgraphOutputConn1 = subgraphs[0]->GetOutputSlot(0)->GetConnection(0);
 
             // Construct dummy pre-compiled layer
             PreCompiledDescriptor preCompiledDescriptor(numInputSlots, numOutputSlots);
             Layer* const preCompiledLayer = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor, "pre-compiled");
 
             // Substitute sub-graph with pre-compiled layer
-            graph.SubstituteSubGraph((std::move(subGraphs[0])), preCompiledLayer);
+            graph.SubstituteSubgraph((std::move(subgraphs[0])), preCompiledLayer);
 
             // Check that connections are correct after substitution
-            BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subGraphInputConn1);
+            BOOST_CHECK_EQUAL(preCompiledLayer->GetInputSlot(0).GetConnection(), subgraphInputConn1);
 
-            BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subGraphOutputConn1);
+            BOOST_CHECK_EQUAL(preCompiledLayer->GetOutputSlot(0).GetConnection(0), subgraphOutputConn1);
         }
     }
 }
 
-BOOST_AUTO_TEST_CASE(MultipleSubGraphs)
+BOOST_AUTO_TEST_CASE(MultipleSubgraphs)
 {
     // This test case represents the scenario when we have two subgraphs
     // in which two layers have CpuAcc backend assigned
@@ -978,8 +981,8 @@
     mergerLayer->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
 
     // CpuAcc sub graph selector
-    SubGraphSelector::SubGraphs subGraphs =
-        SubGraphSelector::SelectSubGraphs(
+    SubgraphViewSelector::Subgraphs subgraphs =
+        SubgraphViewSelector::SelectSubgraphs(
             graph,
             // select the CpuAcc layers only
             [](const Layer & l){
@@ -987,37 +990,37 @@
                 return toSelect;
             });
 
-    BOOST_TEST(subGraphs.size() == 2);
-    if(subGraphs.size() == 2)
+    BOOST_TEST(subgraphs.size() == 2);
+    if(subgraphs.size() == 2)
     {
-        BOOST_TEST((subGraphs[0] != nullptr));
-        BOOST_TEST((subGraphs[1] != nullptr));
+        BOOST_TEST((subgraphs[0] != nullptr));
+        BOOST_TEST((subgraphs[1] != nullptr));
 
-        if (subGraphs[0].get() != nullptr && subGraphs[1].get() != nullptr)
+        if (subgraphs[0].get() != nullptr && subgraphs[1].get() != nullptr)
         {
-            //Sort subGraphs by their inputSlot size.
-            std::sort(subGraphs.begin(), subGraphs.end(),
-                      [](SubGraphSelector::SubGraphPtr & lhs, SubGraphSelector::SubGraphPtr & rhs)
+            //Sort subgraphs by their inputSlot size.
+            std::sort(subgraphs.begin(), subgraphs.end(),
+                      [](SubgraphViewSelector::SubgraphViewPtr & lhs, SubgraphViewSelector::SubgraphViewPtr & rhs)
                       {
                           return (lhs->GetInputSlots().size() < rhs->GetInputSlots().size());
                       }
             );
 
-            unsigned int numInputSlots1  = boost::numeric_cast<unsigned int>(subGraphs[0]->GetInputSlots().size());
-            unsigned int numOutputSlots1 = boost::numeric_cast<unsigned int>(subGraphs[0]->GetOutputSlots().size());
+            unsigned int numInputSlots1  = boost::numeric_cast<unsigned int>(subgraphs[0]->GetInputSlots().size());
+            unsigned int numOutputSlots1 = boost::numeric_cast<unsigned int>(subgraphs[0]->GetOutputSlots().size());
 
-            unsigned int numInputSlots2  = boost::numeric_cast<unsigned int>(subGraphs[1]->GetInputSlots().size());
-            unsigned int numOutputSlots2 = boost::numeric_cast<unsigned int>(subGraphs[1]->GetOutputSlots().size());
+            unsigned int numInputSlots2  = boost::numeric_cast<unsigned int>(subgraphs[1]->GetInputSlots().size());
+            unsigned int numOutputSlots2 = boost::numeric_cast<unsigned int>(subgraphs[1]->GetOutputSlots().size());
 
             // Save sub-graph connections for comparison after substitution
-            IOutputSlot* subGraph1InputConn  = subGraphs[0]->GetInputSlot(0)->GetConnection();
-            IInputSlot* subGraph1OutputConn1 = subGraphs[0]->GetOutputSlot(0)->GetConnection(0);
-            IInputSlot* subGraph1OutputConn2 = subGraphs[0]->GetOutputSlot(1)->GetConnection(0);
+            IOutputSlot* subgraph1InputConn  = subgraphs[0]->GetInputSlot(0)->GetConnection();
+            IInputSlot* subgraph1OutputConn1 = subgraphs[0]->GetOutputSlot(0)->GetConnection(0);
+            IInputSlot* subgraph1OutputConn2 = subgraphs[0]->GetOutputSlot(1)->GetConnection(0);
 
             // Save sub-graph connections for comparison after substitution
-            IOutputSlot* subGraph2InputConn1 = subGraphs[1]->GetInputSlot(0)->GetConnection();
-            IOutputSlot* subGraph2InputConn2 = subGraphs[1]->GetInputSlot(1)->GetConnection();
-            IInputSlot* subGraph2OutputConn  = subGraphs[1]->GetOutputSlot(0)->GetConnection(0);
+            IOutputSlot* subgraph2InputConn1 = subgraphs[1]->GetInputSlot(0)->GetConnection();
+            IOutputSlot* subgraph2InputConn2 = subgraphs[1]->GetInputSlot(1)->GetConnection();
+            IInputSlot* subgraph2OutputConn  = subgraphs[1]->GetOutputSlot(0)->GetConnection(0);
 
             PreCompiledDescriptor preCompiledDescriptor1(numInputSlots1, numOutputSlots1);
             Layer* const preCompiledLayer1 = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor1, "pre-compiled1");
@@ -1026,17 +1029,17 @@
             Layer* const preCompiledLayer2 = graph.AddLayer<PreCompiledLayer>(preCompiledDescriptor2, "pre-compiled2");
 
             // Substitute sub-graph with pre-compiled layer
-            graph.SubstituteSubGraph((std::move(subGraphs[0])), preCompiledLayer1);
-            graph.SubstituteSubGraph((std::move(subGraphs[1])), preCompiledLayer2);
+            graph.SubstituteSubgraph((std::move(subgraphs[0])), preCompiledLayer1);
+            graph.SubstituteSubgraph((std::move(subgraphs[1])), preCompiledLayer2);
 
             // Check that connections are correct after substitution
-            BOOST_CHECK_EQUAL(preCompiledLayer1->GetInputSlot(0).GetConnection(), subGraph1InputConn);
-            BOOST_CHECK_EQUAL(preCompiledLayer1->GetOutputSlot(0).GetConnection(0), subGraph1OutputConn1);
-            BOOST_CHECK_EQUAL(preCompiledLayer1->GetOutputSlot(1).GetConnection(0), subGraph1OutputConn2);
+            BOOST_CHECK_EQUAL(preCompiledLayer1->GetInputSlot(0).GetConnection(), subgraph1InputConn);
+            BOOST_CHECK_EQUAL(preCompiledLayer1->GetOutputSlot(0).GetConnection(0), subgraph1OutputConn1);
+            BOOST_CHECK_EQUAL(preCompiledLayer1->GetOutputSlot(1).GetConnection(0), subgraph1OutputConn2);
 
-            BOOST_CHECK_EQUAL(preCompiledLayer2->GetInputSlot(0).GetConnection(), subGraph2InputConn1);
-            BOOST_CHECK_EQUAL(preCompiledLayer2->GetInputSlot(1).GetConnection(), subGraph2InputConn2);
-            BOOST_CHECK_EQUAL(preCompiledLayer2->GetOutputSlot(0).GetConnection(0), subGraph2OutputConn);
+            BOOST_CHECK_EQUAL(preCompiledLayer2->GetInputSlot(0).GetConnection(), subgraph2InputConn1);
+            BOOST_CHECK_EQUAL(preCompiledLayer2->GetInputSlot(1).GetConnection(), subgraph2InputConn2);
+            BOOST_CHECK_EQUAL(preCompiledLayer2->GetOutputSlot(0).GetConnection(0), subgraph2OutputConn);
         }
     }
 }
diff --git a/src/armnnTfLiteParser/TfLiteParser.cpp b/src/armnnTfLiteParser/TfLiteParser.cpp
index 5733343..0cc6f93 100644
--- a/src/armnnTfLiteParser/TfLiteParser.cpp
+++ b/src/armnnTfLiteParser/TfLiteParser.cpp
@@ -491,15 +491,15 @@
     CHECK_MODEL(m_Model, subgraphIndex, operatorIndex);
     BOOST_ASSERT(layer != nullptr);
 
-    const auto & subGraphPtr = m_Model->subgraphs[subgraphIndex];
-    const auto & operatorPtr = subGraphPtr->operators[operatorIndex];
+    const auto & subgraphPtr = m_Model->subgraphs[subgraphIndex];
+    const auto & operatorPtr = subgraphPtr->operators[operatorIndex];
 
     BOOST_ASSERT(operatorPtr->inputs.size() > 1);
 
     uint32_t reshapedInputId = CHECKED_NON_NEGATIVE(operatorPtr->inputs[0]);
-    TensorRawPtr tensorPtr = subGraphPtr->tensors[reshapedInputId].get();
+    TensorRawPtr tensorPtr = subgraphPtr->tensors[reshapedInputId].get();
     uint32_t inputId = CHECKED_NON_NEGATIVE(operatorPtr->inputs[1]);
-    TensorRawPtr tensorPtr1 = subGraphPtr->tensors[inputId].get();
+    TensorRawPtr tensorPtr1 = subgraphPtr->tensors[inputId].get();
 
     armnn::TensorInfo reshapedTensorInfo = ToTensorInfo(tensorPtr);
     armnn::TensorInfo inputTensorInfo    = ToTensorInfo(tensorPtr1);
@@ -573,7 +573,7 @@
     }
 
     size_t subgraphIndex = 0;
-    for (SubGraphPtr const & subgraph : m_Model->subgraphs)
+    for (SubgraphPtr const & subgraph : m_Model->subgraphs)
     {
         m_SubgraphConnections.emplace_back(subgraph->tensors.size());
 
@@ -2237,15 +2237,15 @@
 {
     CHECK_MODEL(model, subgraphIndex, operatorIndex);
 
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
-    const auto & operatorPtr = subGraphPtr->operators[operatorIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
+    const auto & operatorPtr = subgraphPtr->operators[operatorIndex];
 
     size_t inputCount = operatorPtr->inputs.size();
     TensorRawPtrVector result(inputCount);
     for (size_t i=0; i<inputCount; ++i)
     {
         uint32_t inputId = CHECKED_NON_NEGATIVE(operatorPtr->inputs[i]);
-        result[i] = subGraphPtr->tensors[inputId].get();
+        result[i] = subgraphPtr->tensors[inputId].get();
     }
     return result;
 }
@@ -2256,8 +2256,8 @@
 {
     CHECK_MODEL(model, subgraphIndex, operatorIndex);
 
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
-    const auto & operatorPtr = subGraphPtr->operators[operatorIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
+    const auto & operatorPtr = subgraphPtr->operators[operatorIndex];
 
     size_t outputCount = operatorPtr->outputs.size();
     TensorRawPtrVector result(outputCount);
@@ -2265,7 +2265,7 @@
     {
         uint32_t outputId = CHECKED_NON_NEGATIVE(operatorPtr->outputs[i]);
         CHECK_TENSOR(model, subgraphIndex, outputId);
-        result[i] = subGraphPtr->tensors[outputId].get();
+        result[i] = subgraphPtr->tensors[outputId].get();
     }
     return result;
 }
@@ -2274,15 +2274,15 @@
                                                                    size_t subgraphIndex)
 {
     CHECK_SUBGRAPH(model, subgraphIndex);
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
 
-    size_t inputCount = subGraphPtr->inputs.size();
+    size_t inputCount = subgraphPtr->inputs.size();
     TensorIdRawPtrVector result(inputCount);
     for (size_t i=0; i<inputCount; ++i)
     {
-        uint32_t inputId = CHECKED_NON_NEGATIVE(subGraphPtr->inputs[i]);
+        uint32_t inputId = CHECKED_NON_NEGATIVE(subgraphPtr->inputs[i]);
         CHECK_TENSOR(model, subgraphIndex, inputId);
-        result[i] = std::make_pair(inputId, subGraphPtr->tensors[inputId].get());
+        result[i] = std::make_pair(inputId, subgraphPtr->tensors[inputId].get());
     }
     return result;
 }
@@ -2291,14 +2291,14 @@
                                                                     size_t subgraphIndex)
 {
     CHECK_SUBGRAPH(model, subgraphIndex);
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
 
-    size_t outputCount = subGraphPtr->outputs.size();
+    size_t outputCount = subgraphPtr->outputs.size();
     TensorIdRawPtrVector result(outputCount);
     for (size_t i=0; i<outputCount; ++i)
     {
-        uint32_t outputId = CHECKED_NON_NEGATIVE(subGraphPtr->outputs[i]);
-        result[i] = std::make_pair(outputId, subGraphPtr->tensors[outputId].get());
+        uint32_t outputId = CHECKED_NON_NEGATIVE(subgraphPtr->outputs[i]);
+        result[i] = std::make_pair(outputId, subgraphPtr->tensors[outputId].get());
     }
     return result;
 }
@@ -2308,8 +2308,8 @@
                                                       size_t operatorIndex)
 {
     CHECK_MODEL(model, subgraphIndex, operatorIndex);
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
-    const auto & operatorPtr = subGraphPtr->operators[operatorIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
+    const auto & operatorPtr = subgraphPtr->operators[operatorIndex];
     return operatorPtr->inputs;
 }
 
@@ -2318,8 +2318,8 @@
                                                        size_t operatorIndex)
 {
     CHECK_MODEL(model, subgraphIndex, operatorIndex);
-    const auto & subGraphPtr = model->subgraphs[subgraphIndex];
-    const auto & operatorPtr = subGraphPtr->operators[operatorIndex];
+    const auto & subgraphPtr = model->subgraphs[subgraphIndex];
+    const auto & operatorPtr = subgraphPtr->operators[operatorIndex];
     return operatorPtr->outputs;
 }
 
@@ -2420,7 +2420,7 @@
 {
     CHECK_SUBGRAPH(m_Model, subgraphIndex);
 
-    const auto & subGraphPtr = m_Model->subgraphs[subgraphIndex];
+    const auto & subgraphPtr = m_Model->subgraphs[subgraphIndex];
     for (unsigned int subgraphIndex = 0; subgraphIndex < m_SubgraphConnections.size(); ++subgraphIndex)
     {
         for (unsigned int tensorIndex = 0; tensorIndex < m_SubgraphConnections[subgraphIndex].size(); ++tensorIndex)
@@ -2428,7 +2428,7 @@
             if (m_SubgraphConnections[subgraphIndex][tensorIndex].outputSlot == nullptr &&
                 m_SubgraphConnections[subgraphIndex][tensorIndex].inputSlots.size() > 0)
             {
-                TensorRawPtr tensorPtr = subGraphPtr->tensors[tensorIndex].get();
+                TensorRawPtr tensorPtr = subgraphPtr->tensors[tensorIndex].get();
                 armnn::TensorInfo tensorInfo = ToTensorInfo(tensorPtr);
                 auto tensorAndData = CreateConstTensor(tensorPtr,
                                                        tensorInfo,
diff --git a/src/armnnTfLiteParser/TfLiteParser.hpp b/src/armnnTfLiteParser/TfLiteParser.hpp
index 929af1f..07a0f26 100644
--- a/src/armnnTfLiteParser/TfLiteParser.hpp
+++ b/src/armnnTfLiteParser/TfLiteParser.hpp
@@ -20,7 +20,7 @@
 public:
     // Shorthands for TfLite types
     using ModelPtr = std::unique_ptr<tflite::ModelT>;
-    using SubGraphPtr = std::unique_ptr<tflite::SubGraphT>;
+    using SubgraphPtr = std::unique_ptr<tflite::SubGraphT>;
     using OperatorPtr = std::unique_ptr<tflite::OperatorT>;
     using OperatorCodePtr = std::unique_ptr<tflite::OperatorCodeT>;
     using TensorPtr = std::unique_ptr<tflite::TensorT>;
diff --git a/src/armnnTfLiteParser/test/GetTensorIds.cpp b/src/armnnTfLiteParser/test/GetTensorIds.cpp
index c55b6d3..6b82bb1 100644
--- a/src/armnnTfLiteParser/test/GetTensorIds.cpp
+++ b/src/armnnTfLiteParser/test/GetTensorIds.cpp
@@ -135,13 +135,13 @@
     BOOST_CHECK_THROW(TfLiteParser::GetOutputTensorIds(nullptr, 0, 0), armnn::ParseException);
 }
 
-BOOST_FIXTURE_TEST_CASE(GetInputTensorIdsInvalidSubGraph, GetInputOutputTensorIdsFixture)
+BOOST_FIXTURE_TEST_CASE(GetInputTensorIdsInvalidSubgraph, GetInputOutputTensorIdsFixture)
 {
     TfLiteParser::ModelPtr model = TfLiteParser::LoadModelFromBinary(m_GraphBinary.data(), m_GraphBinary.size());
     BOOST_CHECK_THROW(TfLiteParser::GetInputTensorIds(model, 1, 0), armnn::ParseException);
 }
 
-BOOST_FIXTURE_TEST_CASE(GetOutputTensorIdsInvalidSubGraph, GetInputOutputTensorIdsFixture)
+BOOST_FIXTURE_TEST_CASE(GetOutputTensorIdsInvalidSubgraph, GetInputOutputTensorIdsFixture)
 {
     TfLiteParser::ModelPtr model = TfLiteParser::LoadModelFromBinary(m_GraphBinary.data(), m_GraphBinary.size());
     BOOST_CHECK_THROW(TfLiteParser::GetOutputTensorIds(model, 1, 0), armnn::ParseException);
diff --git a/src/armnnTfLiteParser/test/LoadModel.cpp b/src/armnnTfLiteParser/test/LoadModel.cpp
index ea49010..dac30ef 100644
--- a/src/armnnTfLiteParser/test/LoadModel.cpp
+++ b/src/armnnTfLiteParser/test/LoadModel.cpp
@@ -10,7 +10,7 @@
 
 using armnnTfLiteParser::TfLiteParser;
 using ModelPtr = TfLiteParser::ModelPtr;
-using SubGraphPtr = TfLiteParser::SubGraphPtr;
+using SubgraphPtr = TfLiteParser::SubgraphPtr;
 using OperatorPtr = TfLiteParser::OperatorPtr;
 
 BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)
@@ -156,7 +156,7 @@
         }
     }
 
-    void CheckSubgraph(const SubGraphPtr& subgraph, size_t tensors, const std::vector<int32_t>& inputs,
+    void CheckSubgraph(const SubgraphPtr& subgraph, size_t tensors, const std::vector<int32_t>& inputs,
                        const std::vector<int32_t>& outputs, size_t operators, const std::string& name)
     {
         BOOST_CHECK(subgraph);
diff --git a/src/backends/README.md b/src/backends/README.md
index c269ea0..90eeed2 100644
--- a/src/backends/README.md
+++ b/src/backends/README.md
@@ -116,11 +116,11 @@
     virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const = 0;
     virtual Optimizations GetOptimizations() const = 0;
     virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
-    virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const = 0;
+    virtual SubgraphUniquePtr OptimizeSubgraph(const SubgraphView& subgraph, bool& optimizationAttempted) const = 0;
 ```
 
 Note that ```GetOptimizations()``` has been deprecated.
-The method ```OptimizeSubGraph(...)``` should be used instead to specific optimizations to a given sub-graph.
+The method ```OptimizeSubgraph(...)``` should be used instead to specific optimizations to a given sub-graph.
 
 The ArmNN framework then creates instances of the IBackendInternal interface with the help of the
 [BackendRegistry](backendsCommon/BackendRegistry.hpp) singleton.
@@ -191,7 +191,7 @@
 ## The Optimizations
 
 The backends may choose to implement backend-specific optimizations.
-This is supported through the method ```OptimizeSubGraph(...)``` to the backend interface
+This is supported through the method ```OptimizeSubgraph(...)``` to the backend interface
 that allows the backends to apply their specific optimizations to a given sub-grah.
 
 The way backends had to provide a list optimizations to the Optimizer (through the ```GetOptimizations()``` method)
diff --git a/src/backends/backendsCommon/IBackendInternal.hpp b/src/backends/backendsCommon/IBackendInternal.hpp
index 6e6d47f..108e66e 100644
--- a/src/backends/backendsCommon/IBackendInternal.hpp
+++ b/src/backends/backendsCommon/IBackendInternal.hpp
@@ -7,8 +7,8 @@
 #include <armnn/Types.hpp>
 #include <armnn/IRuntime.hpp>
 
-#include <ISubGraphConverter.hpp>
-#include <SubGraph.hpp>
+#include <ISubgraphViewConverter.hpp>
+#include <SubgraphView.hpp>
 
 #include <vector>
 
@@ -41,9 +41,9 @@
     using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
     using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
 
-    using ISubGraphConverterPtr = std::unique_ptr<ISubGraphConverter>;
+    using ISubgraphViewConverterPtr = std::unique_ptr<ISubgraphViewConverter>;
 
-    using SubGraphUniquePtr = std::unique_ptr<SubGraph>;
+    using SubgraphViewUniquePtr = std::unique_ptr<SubgraphView>;
 
     virtual IMemoryManagerUniquePtr CreateMemoryManager() const = 0;
 
@@ -52,12 +52,14 @@
 
     virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const = 0;
 
-    virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const = 0;
+    virtual ISubgraphViewConverterPtr CreateSubgraphViewConverter(const std::shared_ptr<SubgraphView>& subgraph)
+        const = 0;
 
     virtual Optimizations GetOptimizations() const = 0;
     virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
 
-    virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const = 0;
+    virtual SubgraphViewUniquePtr OptimizeSubgraphView(const SubgraphView& subgraph, bool& optimizationAttempted)
+        const = 0;
 };
 
 using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
diff --git a/src/backends/cl/ClBackend.cpp b/src/backends/cl/ClBackend.cpp
index dfa5e7c..25318ec 100644
--- a/src/backends/cl/ClBackend.cpp
+++ b/src/backends/cl/ClBackend.cpp
@@ -63,10 +63,10 @@
     return IBackendContextPtr{new ClBackendContext{options}};
 }
 
-IBackendInternal::ISubGraphConverterPtr ClBackend::CreateSubGraphConverter(
-    const std::shared_ptr<SubGraph>& subGraph) const
+IBackendInternal::ISubgraphViewConverterPtr ClBackend::CreateSubgraphViewConverter(
+    const std::shared_ptr<SubgraphView>& subgraph) const
 {
-    return ISubGraphConverterPtr{};
+    return ISubgraphViewConverterPtr{};
 }
 
 IBackendInternal::Optimizations ClBackend::GetOptimizations() const
@@ -80,13 +80,13 @@
     return layerSupport;
 }
 
-IBackendInternal::SubGraphUniquePtr ClBackend::OptimizeSubGraph(const SubGraph& subGraph,
-                                                                bool& optimizationAttempted) const
+IBackendInternal::SubgraphViewUniquePtr ClBackend::OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                        bool& optimizationAttempted) const
 {
     // Not trying to optimize the given sub-graph
     optimizationAttempted = false;
 
-    return SubGraphUniquePtr{};
+    return SubgraphViewUniquePtr{};
 }
 
 } // namespace armnn
diff --git a/src/backends/cl/ClBackend.hpp b/src/backends/cl/ClBackend.hpp
index 8133ce4..e50c7e1 100644
--- a/src/backends/cl/ClBackend.hpp
+++ b/src/backends/cl/ClBackend.hpp
@@ -25,14 +25,14 @@
 
     IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
 
-    IBackendInternal::ISubGraphConverterPtr CreateSubGraphConverter(
-        const std::shared_ptr<SubGraph>& subGraph) const override;
+    IBackendInternal::ISubgraphViewConverterPtr CreateSubgraphViewConverter(
+        const std::shared_ptr<SubgraphView>& subgraph) const override;
 
     IBackendInternal::Optimizations GetOptimizations() const override;
     IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
 
-    IBackendInternal::SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph,
-                                                         bool& optimizationAttempted) const override;
+    IBackendInternal::SubgraphViewUniquePtr OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                 bool& optimizationAttempted) const override;
 };
 
 } // namespace armnn
diff --git a/src/backends/neon/NeonBackend.cpp b/src/backends/neon/NeonBackend.cpp
index 830d637..096fe26 100644
--- a/src/backends/neon/NeonBackend.cpp
+++ b/src/backends/neon/NeonBackend.cpp
@@ -63,10 +63,10 @@
     return IBackendContextPtr{};
 }
 
-IBackendInternal::ISubGraphConverterPtr NeonBackend::CreateSubGraphConverter(
-    const std::shared_ptr<SubGraph>& subGraph) const
+IBackendInternal::ISubgraphViewConverterPtr NeonBackend::CreateSubgraphViewConverter(
+    const std::shared_ptr<SubgraphView>& subgraph) const
 {
-    return ISubGraphConverterPtr{};
+    return ISubgraphViewConverterPtr{};
 }
 
 IBackendInternal::Optimizations NeonBackend::GetOptimizations() const
@@ -80,13 +80,13 @@
     return layerSupport;
 }
 
-IBackendInternal::SubGraphUniquePtr NeonBackend::OptimizeSubGraph(const SubGraph& subGraph,
-                                                                  bool& optimizationAttempted) const
+IBackendInternal::SubgraphViewUniquePtr NeonBackend::OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                          bool& optimizationAttempted) const
 {
     // Not trying to optimize the given sub-graph
     optimizationAttempted = false;
 
-    return SubGraphUniquePtr{};
+    return SubgraphViewUniquePtr{};
 }
 
 } // namespace armnn
diff --git a/src/backends/neon/NeonBackend.hpp b/src/backends/neon/NeonBackend.hpp
index 6347045..a2949b1 100644
--- a/src/backends/neon/NeonBackend.hpp
+++ b/src/backends/neon/NeonBackend.hpp
@@ -25,14 +25,14 @@
 
     IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
 
-    IBackendInternal::ISubGraphConverterPtr CreateSubGraphConverter(
-        const std::shared_ptr<SubGraph>& subGraph) const override;
+    IBackendInternal::ISubgraphViewConverterPtr CreateSubgraphViewConverter(
+        const std::shared_ptr<SubgraphView>& subgraph) const override;
 
     IBackendInternal::Optimizations GetOptimizations() const override;
     IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
 
-    IBackendInternal::SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph,
-                                                         bool& optimizationAttempted) const override;
+    IBackendInternal::SubgraphViewUniquePtr OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                 bool& optimizationAttempted) const override;
 };
 
 } // namespace armnn
diff --git a/src/backends/reference/RefBackend.cpp b/src/backends/reference/RefBackend.cpp
index d5f5348..006f2e7 100644
--- a/src/backends/reference/RefBackend.cpp
+++ b/src/backends/reference/RefBackend.cpp
@@ -56,10 +56,10 @@
     return IMemoryManagerUniquePtr{};
 }
 
-IBackendInternal::ISubGraphConverterPtr RefBackend::CreateSubGraphConverter(
-    const std::shared_ptr<SubGraph>& subGraph) const
+IBackendInternal::ISubgraphViewConverterPtr RefBackend::CreateSubgraphViewConverter(
+    const std::shared_ptr<SubgraphView>& subgraph) const
 {
-    return ISubGraphConverterPtr{};
+    return ISubgraphViewConverterPtr{};
 }
 
 IBackendInternal::Optimizations RefBackend::GetOptimizations() const
@@ -73,13 +73,13 @@
     return layerSupport;
 }
 
-IBackendInternal::SubGraphUniquePtr RefBackend::OptimizeSubGraph(const SubGraph& subGraph,
-                                                                 bool& optimizationAttempted) const
+IBackendInternal::SubgraphViewUniquePtr RefBackend::OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                         bool& optimizationAttempted) const
 {
     // Not trying to optimize the given sub-graph
     optimizationAttempted = false;
 
-    return SubGraphUniquePtr{};
+    return SubgraphViewUniquePtr{};
 }
 
 } // namespace armnn
diff --git a/src/backends/reference/RefBackend.hpp b/src/backends/reference/RefBackend.hpp
index 6305bf5..8658e1a 100644
--- a/src/backends/reference/RefBackend.hpp
+++ b/src/backends/reference/RefBackend.hpp
@@ -25,14 +25,14 @@
 
     IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
 
-    IBackendInternal::ISubGraphConverterPtr CreateSubGraphConverter(
-        const std::shared_ptr<SubGraph>& subGraph) const override;
+    IBackendInternal::ISubgraphViewConverterPtr CreateSubgraphViewConverter(
+        const std::shared_ptr<SubgraphView>& subgraph) const override;
 
     IBackendInternal::Optimizations GetOptimizations() const override;
     IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
 
-    IBackendInternal::SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph,
-                                                         bool& optimizationAttempted) const override;
+    IBackendInternal::SubgraphViewUniquePtr OptimizeSubgraphView(const SubgraphView& subgraph,
+                                                                 bool& optimizationAttempted) const override;
 };
 
 } // namespace armnn
diff --git a/tests/InferenceModel.hpp b/tests/InferenceModel.hpp
index 72c5eda..fa71b30 100644
--- a/tests/InferenceModel.hpp
+++ b/tests/InferenceModel.hpp
@@ -198,19 +198,19 @@
             network = parser->CreateNetworkFromBinary(file);
         }
 
-        unsigned int subGraphId = boost::numeric_cast<unsigned int>(params.m_SubgraphId);
+        unsigned int subgraphId = boost::numeric_cast<unsigned int>(params.m_SubgraphId);
 
         for (const std::string& inputLayerName : params.m_InputBindings)
         {
             armnnDeserializer::BindingPointInfo inputBinding =
-                parser->GetNetworkInputBindingInfo(subGraphId, inputLayerName);
+                parser->GetNetworkInputBindingInfo(subgraphId, inputLayerName);
             inputBindings.push_back(std::make_pair(inputBinding.m_BindingId, inputBinding.m_TensorInfo));
         }
 
         for (const std::string& outputLayerName : params.m_OutputBindings)
         {
             armnnDeserializer::BindingPointInfo outputBinding =
-                parser->GetNetworkOutputBindingInfo(subGraphId, outputLayerName);
+                parser->GetNetworkOutputBindingInfo(subgraphId, outputLayerName);
             outputBindings.push_back(std::make_pair(outputBinding.m_BindingId, outputBinding.m_TensorInfo));
         }