public static void Initialize(Dispatcher dispatcher)
        {
            Button.Implementation.Factory = (command, contentFactory, text, isDefault) =>
            {
                if (contentFactory != null)
                {
                    var states = new BehaviorSubject <ButtonStates>(ButtonStates.Unrooted);

                    var content = contentFactory(states.Switch());

                    return(Control.Create(self =>
                    {
                        Action action = () => { };
                        var button = new CustomButton();
                        button.Click += (s, a) => action();

                        states.OnNext(new ButtonStates(
                                          isPressed: button.ObserveDependencyProperty(instance => instance.IsPressed, ButtonBase.IsPressedProperty),
                                          isHovered: button.ObserveDependencyProperty(instance => instance.IsMouseOver, ButtonBase.IsMouseOverProperty),
                                          isEnabled: button.ObserveDependencyProperty(instance => instance.IsEnabled, ButtonBase.IsEnabledProperty)));

                        content.Mount(
                            new MountLocation.Mutable
                        {
                            NativeFrame = ObservableMath.RectangleWithSize(self.NativeFrame.Size),
                            AvailableSize = self.AvailableSize,
                            IsRooted = self.IsRooted,
                        });

                        var child = content.NativeHandle as UIElement;
                        if (child != null)
                        {
                            var grid = new Grid();
                            grid.Children.Add(
                                new System.Windows.Shapes.Rectangle()
                            {
                                Fill = new SolidColorBrush(Colors.Transparent)
                            });
                            grid.Children.Add(child);
                            button.Content = grid;
                        }
                        ;


                        self.BindNativeProperty(dispatcher, "command", command.Action, cmd =>
                        {
                            button.IsEnabled = cmd.HasValue;
                            action = () => cmd.Do(x => x());
                        });

                        self.BindNativeDefaults(button, dispatcher);

                        return button;
                    })
                           .WithSize(content.DesiredSize));
                }
                else
                {
                    var width = new ReplaySubject <Points>(1);

                    return(Control.Create(self =>
                    {
                        Action action = () => { };
                        var button = new System.Windows.Controls.Button();
                        button.Click += (s, a) => action();


                        command
                        .Action
                        .CombineLatest(text)
                        .Take(1)
                        .ObserveOn(Fusion.Application.MainThread)
                        .Subscribe(
                            cmdText =>
                        {
                            UpdateButtonFields(button, cmdText.Item1.HasValue, cmdText.Item2, width);
                        });

                        self.BindNativeProperty(dispatcher, "command", command.Action.CombineLatest(text), cmdText =>
                        {
                            UpdateButtonFields(button, cmdText.Item1.HasValue, cmdText.Item2, width);
                            action = () => cmdText.Item1.Do(x => x());
                        });

                        self.BindNativeDefaults(button, dispatcher);

                        return button;
                    })
                           .WithHeight(20)
                           .WithWidth(width)
                           .WithPadding(new Thickness <Points>(6)));
                }
            };
        }