         </Grid>
 
 
-ProjectController = rclass
-    getDefaultProps: ->
-        project_map : undefined    # an array of projects (or undefined = loading...)
-
-    componentWillReceiveProps: (props) ->
-        @update_project_list(props.project_map)
-
-    update_project_list: (project_map) ->
-        @project_list = (project for project_id, project of project_map)
-        for p in @project_list
-            p.hashtags = parse_project_tags(p)
-            # also search string
-            # and only do this to the projects that change -- use immutable js to know
-        @project_list.sort (p0, p1) -> -misc.cmp(p0.last_edited, p1.last_edited)
-
-    render: ->
-        if not @props.project_map?
-            # TODO
-            return <div>Loading...</div>
-        else
-            if not @project_list?
-                @update_project_list(@props.project_map)
-            return <ProjectSelector project_list={@project_list} />
-
 ProjectsPage = rclass
     render: ->
-        <FluxComponent flux={flux} connectToStores = {'projects'}>
-            <ProjectController />
+        <FluxComponent flux={flux} connectToStores={'projects'}>
+            <ProjectSelector />
         </FluxComponent>
 
 React.render(<ProjectsPage />, document.getElementById("projects"))

    filter: ->
        "#{@props.hidden}-#{@props.deleted}"

    # All hashtags from visible projects
    hashtags: ->
        tags = {}
        for _, project of @props.project_list
            if @project_is_in_filter(project, @props.hidden, @props.deleted)
                for tag in parse_project_tags(project)
                    tags[tag] = true
        return misc.keys(tags).sort()

    # Returns true if the project should be visible with the current filters active
    project_is_in_filter: (project) ->
        account_id = require('account').account_settings.account_id()
        !!project.deleted == @props.deleted and !!project.users[account_id].hide == @props.hidden


    render_projects_title: ->
        projects_title_styles =

        if next.project_update_tag != @props.project_update_tag
            parse_project_search_string.clear_cache()
            hashtags.clear_cache()
        @update_project_list(next.project_map)

    update_project_list: (project_map) ->
        @_project_list = (project for project_id, project of project_map)
        for p in @_project_list
            p.hashtags = parse_project_tags(p)
            # also search string
            # and only do this to the projects that change -- use immutable js to know
        @_project_list.sort (p0, p1) -> -misc.cmp(p0.last_edited, p1.last_edited)
        return @_project_list

    project_list: ->
        return @_project_list ? @update_project_list(@props.project_map)

    # Takes a project and a list of search terms, returns true if all search terms exist in the project
    matches: (project, search_terms) ->
