bool WaterToWaterComponent_Impl::addToNode(Node & node)
{
  auto _model = node.model(); 
  auto thisModelObject = getObject<ModelObject>();
  auto t_plantLoop = node.plantLoop();

  boost::optional<unsigned> componentInletPort;
  boost::optional<unsigned> componentOutletPort;

  boost::optional<HVACComponent> systemStartComponent;
  boost::optional<HVACComponent> systemEndComponent;

  if( node.getImpl<Node_Impl>()->isConnected(thisModelObject) ) return false;

  if( t_plantLoop ) {
    if( t_plantLoop->supplyComponent(node.handle()) ) {

      systemStartComponent = t_plantLoop->supplyInletNode();
      systemEndComponent = t_plantLoop->supplyOutletNode();
      componentInletPort = supplyInletPort();
      componentOutletPort = supplyOutletPort();

      removeFromPlantLoop();
    } else if( t_plantLoop->demandComponent(node.handle()) ) {

      systemStartComponent = t_plantLoop->demandInletNode();
      systemEndComponent = t_plantLoop->demandOutletNode();
      componentInletPort = demandInletPort();
      componentOutletPort = demandOutletPort();

      removeFromSecondaryPlantLoop();
    }
  }

  if( systemStartComponent && systemEndComponent && componentOutletPort && componentInletPort ) {
    return HVACComponent_Impl::addToNode(node,systemStartComponent.get(),systemEndComponent.get(),componentInletPort.get(),componentOutletPort.get());
  } else {
    return false;
  }
}
bool WaterToAirComponent_Impl::addToNode(Node & node)
{
    auto _model = node.model();
    auto thisModelObject = getObject<ModelObject>();
    auto t_airLoop = node.airLoopHVAC();
    auto t_plantLoop = node.plantLoop();
    auto t_oaSystem = node.airLoopHVACOutdoorAirSystem();

    boost::optional<unsigned> componentInletPort;
    boost::optional<unsigned> componentOutletPort;

    boost::optional<HVACComponent> systemStartComponent;
    boost::optional<HVACComponent> systemEndComponent;

    if( node.getImpl<Node_Impl>()->isConnected(thisModelObject) ) return false;

    if( t_airLoop && ! t_oaSystem )
    {
        if( t_airLoop->demandComponent( node.handle() ) ) return false;

        systemStartComponent = t_airLoop->supplyInletNode();
        auto nodes = t_airLoop->supplyOutletNodes();
        OS_ASSERT( ! nodes.empty() );
        if( (nodes.size() == 2u) && (! t_airLoop->supplyComponents(node,nodes[1]).empty()) ) {
            systemEndComponent = nodes[1];
        } else {
            systemEndComponent = nodes[0];
        }
        OS_ASSERT(systemEndComponent);
        componentInletPort = airInletPort();
        componentOutletPort = airOutletPort();

        removeFromAirLoopHVAC();
    } else if( t_oaSystem ) {
        if( t_oaSystem->oaComponent(node.handle()) ) {
            systemStartComponent = t_oaSystem->outboardOANode();
            systemEndComponent = t_oaSystem.get();
            componentInletPort = airInletPort();
            componentOutletPort = airOutletPort();
        } else if( t_oaSystem->reliefComponent(node.handle()) ) {
            systemStartComponent = t_oaSystem.get();
            systemEndComponent = t_oaSystem->outboardReliefNode();
            componentInletPort = airInletPort();
            componentOutletPort = airOutletPort();
        }
        removeFromAirLoopHVAC();
    } else if( t_plantLoop ) {
        if( ! t_plantLoop->demandComponent( node.handle() ) ) return false;

        systemStartComponent = t_plantLoop->demandInletNode();
        systemEndComponent = t_plantLoop->demandOutletNode();
        componentInletPort = waterInletPort();
        componentOutletPort = waterOutletPort();

        removeFromPlantLoop();
    }

    if( systemStartComponent && systemEndComponent && componentOutletPort && componentInletPort ) {
        return HVACComponent_Impl::addToNode(node,systemStartComponent.get(),systemEndComponent.get(),componentInletPort.get(),componentOutletPort.get());
    } else {
        return false;
    }
}