diff --git a/app/schemas/models/achievement.coffee b/app/schemas/models/achievement.coffee
index f1ce6351b..1443d99cd 100644
--- a/app/schemas/models/achievement.coffee
+++ b/app/schemas/models/achievement.coffee
@@ -7,8 +7,9 @@ module.exports =
       name: c.shortString({title: 'Display Name'})
       query: { $ref: 'mongoFindQuery' } # TODO make this happen
       worth: { type: 'number' }
-      collection: { type: 'string' }
+      model: { type: 'string' }
       description: { type: 'string' }
+      userField: { type: 'string' }
       proportionalTo:
         type: 'string'
         description: 'For repeatables only. Denotes the field a repeatable achievement needs for its calculations'
diff --git a/app/schemas/models/achievement_earned.coffee b/app/schemas/models/earned_achievement.coffee
similarity index 86%
rename from app/schemas/models/achievement_earned.coffee
rename to app/schemas/models/earned_achievement.coffee
index 719266067..d56787ffb 100644
--- a/app/schemas/models/achievement_earned.coffee
+++ b/app/schemas/models/earned_achievement.coffee
@@ -20,6 +20,10 @@ module.exports =
               href: '/db/user/{($)}'
             }
           ]
+      achievementName:
+        type: 'string'
+      created:
+        type: 'date'
       achievedAmount:
         type: 'number'
       notified:
diff --git a/server/achievements/Achievement.coffee b/server/achievements/Achievement.coffee
index 3dedd0b78..6ad5e5c71 100644
--- a/server/achievements/Achievement.coffee
+++ b/server/achievements/Achievement.coffee
@@ -10,4 +10,4 @@ AchievementSchema = new mongoose.Schema({
   query: Object
 }, {strict: false})
 
-module.exports = Achievement = mongoose.model('achievements', AchievementSchema)
\ No newline at end of file
+module.exports = Achievement = mongoose.model('achievement', AchievementSchema)
\ No newline at end of file
diff --git a/server/achievements/EarnedAchievement.coffee b/server/achievements/EarnedAchievement.coffee
new file mode 100644
index 000000000..dd46c20d0
--- /dev/null
+++ b/server/achievements/EarnedAchievement.coffee
@@ -0,0 +1,13 @@
+mongoose = require 'mongoose'
+jsonschema = require '../../app/schemas/models/earned_achievement'
+
+EarnedAchievementSchema = new mongoose.Schema({
+  created:
+    type: Date
+    default: Date.now
+  notified:
+    type: Boolean
+    default: false
+}, {strict:false})
+
+module.exports = EarnedAchievement = mongoose.model('earned_achievement', EarnedAchievementSchema)
\ No newline at end of file
diff --git a/server/achievements/earned/AchievementEarned.coffee b/server/achievements/earned/AchievementEarned.coffee
deleted file mode 100644
index 7020ea4ab..000000000
--- a/server/achievements/earned/AchievementEarned.coffee
+++ /dev/null
@@ -1,8 +0,0 @@
-mongoose = require 'mongoose'
-jsonschema = require '../../../app/schemas/models/achievement_earned'
-
-AchievementEarnedSchema = new mongoose.Schema({
-  user: Object
-}, {strict:false})
-
-module.exports = AchievementEarned = mongoose.model('achievements.earned', AchievementEarnedSchema)
\ No newline at end of file
diff --git a/server/plugins/achievements.coffee b/server/plugins/achievements.coffee
index 379caa41a..5a115dbfd 100644
--- a/server/plugins/achievements.coffee
+++ b/server/plugins/achievements.coffee
@@ -1,6 +1,7 @@
 mongoose = require('mongoose')
 Achievement = require('../achievements/Achievement')
-AchievementEarned = require '../achievements/earned/AchievementEarned'
+EarnedAchievement = require '../achievements/EarnedAchievement'
+LocalMongo = require '../../app/lib/LocalMongo'
 
 achievements = {}
 
@@ -9,13 +10,13 @@ loadAchievements = ->
   query = Achievement.find({})
   query.exec (err, docs) ->
     _.each docs, (achievement) ->
-      achievements[achievement.get 'collection'] = [] unless achievement.collection in achievements
-      achievements[achievement.get 'collection'].push achievement
+      category = achievement.get 'model'
+      achievements[category] = [] unless category of achievements
+      achievements[category].push achievement
 
 loadAchievements()
 
 
-
 # TODO make a difference between '$userID' and '$userObjectID' ?
 module.exports = AchievablePlugin = (schema, options) ->
   checkForAchievement = (doc) ->
@@ -24,18 +25,41 @@ module.exports = AchievablePlugin = (schema, options) ->
     for achievement in achievements[collectionName]
       console.log achievement.get 'name'
 
-  fetched = {}
+  before = {}
 
   schema.post 'init', (doc) ->
-    fetched[doc.id] = doc
-    collectionName = doc.constructor.modelName
-    for achievement in achievements[collectionName]
-      console.log achievement.get 'name'
-
+    before[doc.id] = doc
   schema.post 'save', (doc) ->
-    collectionName = doc.constructor.modelName
-    docBefore = fetched?.doc.id
-    for achievement in achievements[collectionName]
-      "placeholder"
-      # continue if init'd and already achieved
-      # else if new doc validates, new achievement! make the fucker
\ No newline at end of file
+    isNew = not doc.isInit('_id')
+    console.log doc
+    console.log 'is new: ' + isNew
+
+    category = doc.constructor.modelName
+    console.log 'category: ' + category
+
+    if category of achievements
+      docObj = doc.toObject()
+      for achievement in achievements[category]
+        query = achievement.get('query')
+        isRepeatable = achievement.get('proportionalTo')?
+        console.log 'isRepeatable: ' + isRepeatable
+        alreadyAchieved = false
+        unless isNew
+          previousDocObj = before[doc.id].toObject()
+          alreadyAchieved = LocalMongo.matchesQuery previousDocObj, query
+          console.log 'Already achieved: ' + alreadyAchieved
+        console.log 'Matches: ' + LocalMongo.matchesQuery(docObj, query)
+        if LocalMongo.matchesQuery(docObj, query) and (isRepeatable or not alreadyAchieved)
+          userID = doc.get(achievement.get('userField'))
+          console.log 'Creating a new earned achievement for \'' + (achievement.get 'name') + '\' for ' + userID
+          earned = new EarnedAchievement(
+            user: if _.isObject userID then userID else new mongoose.Types.ObjectId(userID) # Standardize! Use ObjectId's
+            achievement: achievement._id
+            achievementName: achievement.get 'name'
+          )
+          console.log earned
+          earned.save (err, doc) ->
+            console.log 'so something went wrong' if err?
+
+    delete before[doc.id] unless isNew # This assumes everything we patch has a _id
+    return
\ No newline at end of file