It seems like there is a TreeGrid sorting bug:

Code:
    private static final StockProperties props = GWT.create(StockProperties.class);
    private TreeGrid<Stock> tree;

    public void onModuleLoad()
    {
        TreeStore<Stock> store = new TreeStore<Stock>(props.key());

        ColumnConfig<Stock, String> c = new ColumnConfig<Stock, String>(props.name(), 100, "Tree");
        List<ColumnConfig<Stock, ?>> colList = new LinkedList<ColumnConfig<Stock, ?>>();
        colList.add(c);

        tree = new TreeGrid<Stock>(store, new ColumnModel<Stock>(colList), c);
        tree.getTreeStore().addSortInfo(new StoreSortInfo<Stock>(props.sortindex(), SortDir.ASC)); // ERROR

        TextButton button = new TextButton("load");
        button.addSelectHandler(new SelectHandler()
        {
            @Override
            public void onSelect(SelectEvent event)
            {
                clearAndLoadData();
            }
        });

        BorderLayoutContainer blc = new BorderLayoutContainer();
        blc.setNorthWidget(button, new BorderLayoutData(50));
        blc.setCenterWidget(tree);

        CustomViewport vp = new CustomViewport();
        vp.add(blc);
        RootLayoutPanel.get().add(vp);
    }

    private void clearAndLoadData()
    {
        tree.getTreeStore().clear();

        List<Stock> list = new LinkedList<GXT_3_0.Stock>();
        Stock stock5 = new Stock("key5", "E (1)", 1);
        Stock stock3 = new Stock("key3", "C (3)", 3);
        Stock stock2 = new Stock("key2", "B (2)", 2);
        Stock stock4 = new Stock("key4", "D (4)", 4);
        Stock stock1 = new Stock("key1", "A (5)", 5);

        list.add(stock1);
        list.add(stock2);
        list.add(stock3);
        list.add(stock4);
        list.add(stock5);

        Stock root = new Stock("muh", "root", 0);

        tree.getTreeStore().add(root);
        for (Stock stock : list)
            tree.getTreeStore().add(root, stock);

    }

    interface StockProperties extends PropertyAccess<Stock>
    {
        ModelKeyProvider<Stock> key();

        ValueProvider<Stock, String> name();

        ValueProvider<Stock, Integer> sortindex();
    }

    class Stock
    {
        public Stock(String key, String name, int sortindex)
        {
            this.key = key;
            this.name = name;
            this.sortindex = sortindex;
        }

        int sortindex = 0;
        String key = "";
        String name = "";

        public String getKey()
        {
            return key;
        }

        public void setKey(String key)
        {
            this.key = key;
        }

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }

        public int getSortindex()
        {
            return sortindex;
        }

        public void setSortindex(int sortindex)
        {
            this.sortindex = sortindex;
        }
    }
And here is the compiler error message:
Caused by: java.lang.AssertionError: null
at com.sencha.gxt.data.shared.TreeStore$TreeModel.addChild(TreeStore.java:80)
at com.sencha.gxt.data.shared.TreeStore.insert(TreeStore.java:897)
at com.sencha.gxt.data.shared.TreeStore.add(TreeStore.java:330)
at nope.client.GXT_3_0.clearAndLoadData(GXT_3_0.java:79)
I'm using the new SortInfo-Class to set the sort column (exact same thing works fine in a normal grid). I'm also using the getTreeStore() and not getStore() (noticed that in GXT2 already), so I don't know what other mistake I could have made.