public override void OnInitialize()
    {
        //Print("OnInitialize");

        // Ship spawned somehow don't call OnLoad...
        if (node_backup != string.Empty)
        {
            Restore();
        }

        List <Transform> transforms = new List <Transform>(hostPart.FindModelTransforms(transformName));

        if (transforms.Count == 0)
        {
            if (transformName == "partTransform")
            {
                transforms.Add(hostPart.partTransform);
            }
            else
            {
                Log.info("Cannot find transform {0}", transformName);
                return;
            }
        }
        GameObject model = GameDatabase.Instance.GetModel(modelName);

        if (model == null)
        {
            Log.info("Cannot find model {0}", modelName);
            return;
        }
        model.SetActive(true);
        KSPParticleEmitter templateKspParticleEmitter = model.GetComponentInChildren <KSPParticleEmitter>();

        if (templateKspParticleEmitter == null)
        {
            Log.info("Cannot find particle emitter on {0}", modelName);
            Destroy(model);
            return;
        }

        if (persistentEmitters == null)
        {
            persistentEmitters = new List <PersistentKSPShurikenEmitter>();
        }

        if (hostPart.Modules.Contains("ProceduralSRB"))
        {
            PartModule pm = hostPart.Modules["ProceduralSRB"];

            specialScale = pm.Fields.GetValue <float>("bellScale");
            Log.info("Found ProceduralSRB. Rescaling by {0:0.000} final scale {1}:0.000}", specialScale, (fixedScale * specialScale));
        }

        if (hostPart.Modules.Contains("TweakScale"))
        {
            PartModule pm           = hostPart.Modules["TweakScale"];
            float      tweakScale   = pm.Fields.GetValue <float>("currentScale");
            float      defaultScale = pm.Fields.GetValue <float>("defaultScale");
            specialScale = tweakScale / (defaultScale <= 0 ? 1 : defaultScale);
            Log.info("Found TweakScale. Rescaling by {0:0.000} final scale {1:0.000}", specialScale, (fixedScale * specialScale));
        }

        for (int i = 0; i < transforms.Count; i++)
        {
            GameObject         emitterGameObject       = i == 0 ? model : Instantiate(model);
            KSPParticleEmitter childKSPParticleEmitter = emitterGameObject.GetComponentInChildren <KSPParticleEmitter>();

            if (childKSPParticleEmitter != null)
            {
                ParticleSystem         particleSystem         = childKSPParticleEmitter.gameObject.GetComponent <ParticleSystem>();
                ParticleSystemRenderer particleSystemRenderer = childKSPParticleEmitter.gameObject.GetComponent <ParticleSystemRenderer>();

                PersistentKSPShurikenEmitter pkpe = new PersistentKSPShurikenEmitter(
                    emitterGameObject,
                    particleSystem,
                    particleSystemRenderer,
                    childKSPParticleEmitter);


                // We do the emission and animation ourselves so we disable the KSP code
                childKSPParticleEmitter.emit = false;
                childKSPParticleEmitter.SetupProperties();
                childKSPParticleEmitter.enabled = false;

                ParticleSystem.MainModule main = particleSystem.main;
                main.maxParticles = particleCountLimit;

                //particleSystemRenderer.alignment = ParticleSystemRenderSpace.View;

                pkpe.doesAnimateColor = childKSPParticleEmitter.doesAnimateColor;

                if (childKSPParticleEmitter.doesAnimateColor)
                {
                    ParticleSystem.ColorOverLifetimeModule col = particleSystem.colorOverLifetime;

                    // This one is annoying. The old particle system animate the color over the whole % life of the particle (0 - 1)
                    // The new one animate it over time. So converted system may not reach the full value
                    // The color is manually set in the update of PersistentKSPShurikenEmitter
                    col.enabled = false;

                    Color[] colors = childKSPParticleEmitter.colorAnimation;

                    pkpe.colors = new Color[colors.Length];
                    Array.Copy(colors, pkpe.colors, colors.Length);
                }

                //try
                //{
                //    particleSystemRenderer.renderMode =
                //        (ParticleSystemRenderMode)Enum.Parse(typeof (ParticleSystemRenderMode), renderMode);
                //}
                //catch (ArgumentException)
                //{
                //    Print("ModelMultiParticleFXExt: " + renderMode + " is not a valid ParticleSystemRenderMode");
                //}

                persistentEmitters.Add(pkpe);

                DisableCollider(pkpe.go);

                emitterGameObject.transform.SetParent(transforms[i], false);

                emitterGameObject.transform.localPosition = localPosition;
                emitterGameObject.transform.localRotation = Quaternion.Euler(localRotation);
                emitterGameObject.SetLayerRecursive(layerId);
            }
        }

        list.Add(this);

        // 1.0 don't seems to properly do this for engines.
        //OnEvent(0f);
    }