function Connection(config){

	var self = this;

	// Properties
	self.from = config.from;
	self.to = config.to;
	self.uncuttable = config.uncuttable || false;
	self.sim = config.sim;

	// Line Sprite
	self.sprite = new Sprite({
		src: "sprites/line.png",
		frames:1, sw:300, sh:20,
	});
	self.sprite.pivotX = 2.8;
	self.sprite.pivotY = 10;

	// Dot Sprite
	self.dotSprite = new Sprite({
		src: "sprites/peeps.png",
		frames:6, sw:200, sh:200,
	});
	self.dotSprite.pivotX = 100;
	self.dotSprite.pivotY = 100;
	self.dotSprite.scale = 0.1;

	// Update
	self.update = function(){};

	// Draw
	self.draw = function(ctx){

		var s = self.sim.options.scale || 1;

		ctx.save();
		ctx.translate(self.from.x, self.from.y);
		var dx = self.to.x - self.from.x;
		var dy = self.to.y - self.from.y;
		var a = Math.atan2(dy,dx);
		var dist = Math.sqrt(dx*dx + dy*dy);
		self.sprite.scaleX = dist/300;
		self.sprite.scaleY = self.uncuttable ? 1 : 0.5; // thick=uncuttable
		//self.sprite.scaleY *= s;
		self.sprite.rotation = a;
		self.sprite.draw(ctx);
		ctx.restore();

		// DRAW CONTAGION DOT
		if(self.contagionDot){
			var infectedFrame = self.sim.options.infectedFrame || 1;
			self.dotSprite.x = self.contagionDot.x;
			self.dotSprite.y = self.contagionDot.y;
			self.dotSprite.gotoFrame(infectedFrame);
			self.dotSprite.draw(ctx);
		}

	};

	// Hit Test with a LINE SEGMENT
	// code adapted from https://gist.github.com/Joncom/e8e8d18ebe7fe55c3894
	self.hitTest = function(line){

		var p0_x, p0_y, p1_x, p1_y, p2_x, p2_y, p3_x, p3_y;
		p0_x = line[0];
		p0_y = line[1];
		p1_x = line[2];
		p1_y = line[3];
		p2_x = self.from.x;
		p2_y = self.from.y;
		p3_x = self.to.x;
		p3_y = self.to.y;

    	var s1_x, s1_y, s2_x, s2_y;
	    s1_x = p1_x - p0_x;
	    s1_y = p1_y - p0_y;
	    s2_x = p3_x - p2_x;
	    s2_y = p3_y - p2_y;
	    var s, t;
	    s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
	    t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);

		return (s >= 0 && s <= 1 && t >= 0 && t <= 1);

	};

	// Animate
	self.contagionDot = null;
	self.animate = function(){

		// Infection?
		var cFrom, cTo;
		if(self.from.infected && (!self.to.infected && self.to.isPastThreshold)){
			cFrom = self.from;
			cTo = self.to;
		}
		if(self.to.infected && (!self.from.infected && self.from.isPastThreshold)){
			cFrom = self.to;
			cTo = self.from;
		}

		// boop! 
		if(cFrom && cTo){

			// ANIMATE IT
			cFrom = { x:cFrom.x, y:cFrom.y };
			cTo = { x:cTo.x, y:cTo.y };
			tweenPosition(cFrom, cTo, function(point){
				self.contagionDot = point;
			}, easeLinear);

			// Then, goodbye later
			setTimeout(function(){
				self.contagionDot = null;
			},333);

		}

	};

}