def addLayer(self,
                 uri,
                 fileName,
                 layerId,
                 group=None,
                 visible=False,
                 expanded=False):
        theLayer = None

        # read QGIS project
        doc, _ = self.getQgsDoc(fileName)

        # is project in relative path ?
        absolute = is_absolute(doc)
        trusted = project_trusted(doc)

        node = getFirstChildByTagNameValue(doc.documentElement(), "maplayer",
                                           "id", layerId)
        node = node.cloneNode()
        if node:
            idNode = node.namedItem("id")
            layerType = node.toElement().attribute("type", "vector")
            # give it a new id (for multiple import)
            newLayerId = "L%s" % re.sub("[{}-]", "",
                                        QUuid.createUuid().toString())
            try:
                idNode.firstChild().toText().setData(newLayerId)
            except Exception:
                pass

            # if relative path, adapt datasource
            if not absolute:
                try:
                    datasourceNode = node.namedItem("datasource")
                    ds = datasourceNode.firstChild().toText().data()
                    providerNode = node.namedItem("provider")
                    provider = providerNode.firstChild().toText().data()

                    if provider in ["ogr", "gdal"] and (ds.find(".") == 0):
                        projectpath = QFileInfo(uri).path()
                        newlayerpath = projectpath + "/" + ds
                        datasourceNode.firstChild().toText().setData(
                            newlayerpath)
                except Exception:
                    pass

            # read modified layer node
            if self.optionCreateGroup and group is not None:
                if layerType == "raster":
                    theLayer = QgsRasterLayer()
                else:
                    theLayer = QgsVectorLayer()
                    theLayer.setReadExtentFromXml(trusted)

                theLayer.readLayerXml(node.toElement(), QgsReadWriteContext())

                # Special process if the plugin "DB Style Manager" is installed
                flag = "use_db_style_manager_in_custom_menu" in os.environ
                if flag and "db-style-manager" in plugins:
                    try:
                        plugins["db-style-manager"].load_style_from_database(
                            theLayer)
                    except Exception:
                        self.log("DB-Style-Manager failed to load the style.")

                # needed
                QgsProject.instance().addMapLayer(theLayer, False)

                # add to group
                treeNode = group.insertLayer(0, theLayer)
                treeNode.setExpanded(expanded)
                treeNode.setItemVisibilityChecked(visible)
            else:
                # create layer
                theLayer = QgsProject.instance().readLayer(node)

            return QgsProject.instance().mapLayer(newLayerId)

        else:
            self.log("{} not found".format(layerId))

        return None