     (fn [{:keys [title categories movements]}]
       [:div
        [:h2 title]
+       [:button {:type     "submit"
+                 :on-click #(get-new-movement title)} "+"]
        [:div.pure-g
         (for [m movements]
-          ^{:key (str m (rand-int 10000))} [movement-component m title])]
-       [:button {:type     "submit"
-                 :on-click #(get-new-movement title)} "+"]])))
+          ^{:key (str m (rand-int 100000))} [movement-component m title])]])))
 
 
 (defn session-component []

        [:div.pure-u.movement

         [:div.pure-g
          [:div.pure-u-1-2.refresh {:on-click #()}]
          [:div.pure-u-1-2.destroy {:on-click #(remove-movement m part-title)}]]

         [:div.pure-g.title

      (session/update-in! [:movement-session :parts position-in-parts :movements]
                          conj (first (shuffle @movements))))))

(defn refresh-movement [m part-title]
  (go
    (let [movements (atom [])
          parts (session/get-in [:movement-session :parts])
          position-in-parts (first (positions #{part-title} (map :title parts)))

          movement-list (vec (session/get-in [:movement-session :parts position-in-parts :movements]))

          ;todo: get categories from the movement, not the part.
          categories (:categories (first (filter #(= part-title (:title %)) parts)))
          categories-prepped (mapv #(str/replace % " " "-") categories)]

      (doseq [c categories-prepped]
        (swap! movements conj (first (read-string (<! (GET (str "singlemovement/" c)))))))

      (let [position-in-movement-list (first (positions #{m} movement-list))
            movement-list (assoc movement-list position-in-movement-list (first (shuffle @movements)))]

        (session/assoc-in! [:movement-session :parts position-in-parts :movements]
                            movement-list)))))

(defn remove-movement [m part-title]
  (go
    (let [parts (session/get-in [:movement-session :parts])
