def extend(network, pore_coords=[], throat_conns=[], labels=[]):
    r'''
    Add individual pores and/or throats to the network from a list of coords
    or conns.

    Parameters
    ----------
    network : OpenPNM Network Object
        The Network to which pores or throats should be added

    pore_coords : array_like
        The coordinates of the pores to add

    throat_conns : array_like
        The throat connections to add

    labels : string, or list of strings, optional
        A list of labels to apply to the new pores and throats

    Notes
    -----
    This needs to be enhanced so that it increases the size of all pore
    and throat props and labels on ALL associated Phase objects.  At the
    moment it throws an error is there are any associated Phases.

    This is an in-place operation, meaning the received Network object will
    be altered directly.

    '''
    if len(network.project.phases()) > 0:
        raise Exception('Project has active Phases, copy network to a new ' +
                        'project and try again')

    Np_old = network.num_pores()
    Nt_old = network.num_throats()
    Np = Np_old + int(sp.size(pore_coords)/3)
    Nt = Nt_old + int(sp.size(throat_conns)/2)
    # Adjust 'all' labels
    del network['pore.all'], network['throat.all']
    network['pore.all'] = sp.ones((Np,), dtype=bool)
    network['throat.all'] = sp.ones((Nt,), dtype=bool)
    # Add coords and conns
    if sp.size(pore_coords) > 0:
        coords = sp.vstack((network['pore.coords'], pore_coords))
        network['pore.coords'] = coords
    if sp.size(throat_conns) > 0:
        conns = sp.vstack((network['throat.conns'], throat_conns))
        network['throat.conns'] = conns

    # Increase size of any prop or label arrays aready on Network
    for item in list(network.keys()):
        if item.split('.')[1] not in ['coords', 'conns', 'all', '_id']:
            N = network._count(element=item.split('.')[0])
            arr = network.pop(item)
            s = arr.shape
            network[item] = sp.zeros(shape=(N, *s[1:]), dtype=arr.dtype)
            # This is a temporary work-around until I learn to handle 2+ dims
            network[item][:arr.shape[0]] = arr

    # Apply labels, if supplied
    if labels != []:
        # Convert labels to list if necessary
        if type(labels) is str:
            labels = [labels]
        for label in labels:
            # Remove pore or throat from label, if present
            label = label.split('.')[-1]
            if sp.size(pore_coords) > 0:
                Ps = sp.r_[Np_old:Np]
                if 'pore.'+label not in network.labels():
                    network['pore.'+label] = False
                network['pore.'+label][Ps] = True
            if sp.size(throat_conns) > 0:
                Ts = sp.r_[Nt_old:Nt]
                if 'throat.'+label not in network.labels():
                    network['throat.'+label] = False
                network['throat.'+label][Ts] = True

    # Clear adjacency and incidence matrices which will be out of date now
    network._am.clear()
    network._im.clear()