         label.layer.zPosition = connectorZPosition
         updateScrollableSize()
         
-        self.lastDrawnConnector = label
-        if let (lastConstraint, inputPort) = self.lastDrawnConstraint {
-            let connectorPortUsed = inputPort.connector != nil && connectorToLabel[inputPort.connector!] != nil
-            if !connectorPortUsed {
-                lastConstraint.connectPort(inputPort, connector: label.connector)
-                self.needsLayout = true
-                self.needsSolving = true
-            }
-        }
-        self.lastDrawnConstraint = nil
+        if automaticallyConnect {
+            self.lastDrawnConnector = label
+            if let (lastConstraint, inputPort) = self.lastDrawnConstraint {
+                if label.connector.constraints.count == 0 {
+                    let connectorPortUsed = inputPort.connector != nil && connectorToLabel[inputPort.connector!] != nil
+                    if !connectorPortUsed {
+                        lastConstraint.connectPort(inputPort, connector: label.connector)
+                        self.needsLayout = true
+                        self.needsSolving = true
+                    }
+                }
+                
+                self.lastDrawnConstraint = nil
+            }
+        }
     }
     func moveConnectorToTopPriority(connectorLabel: ConnectorLabel) {
         if let index = find(connectorLabels, connectorLabel) {

                    // TODO: Try to actually parse out an equation, instead of just one component
                    let combinedLabels = classifiedLabels.reduce("", +)
                    var recognized = false
                    if let writtenNumber = combinedLabels.toInt() {
                        // We recognized a number!
                        let newConnector = Connector()
                        let newLabel = ConnectorLabel(connector: newConnector)

        case .Possible:
            break
        }
    }
    
    func connect(connectorLabel: ConnectorLabel, constraintView: ConstraintView, connectorPort: ConnectorPort) {
        for connectorPort in constraintView.connectorPorts() {
            if connectorPort.connector === connectorLabel.connector {
                // This connector is already hooked up to this constraintView. The user is probably trying to change the connection, so we remove the old one
                constraintView.removeConnectorAtPort(connectorPort)
            }
        }
        
        constraintView.connectPort(connectorPort, connector: connectorLabel.connector)
        self.needsSolving = true
        self.needsLayout = true
    }
    
    func connectConstraintViews(firstConstraintView: ConstraintView, firstConnectorPort: ConnectorPort, secondConstraintView: ConstraintView, secondConnectorPort: ConnectorPort) -> ConnectorLabel {
        // We are dragging from one constraint directly to another constraint. To accomodate, we create a connector in-between and make two connections
        let midPoint = (firstConstraintView.center + secondConstraintView.center) / 2.0
        
        let newConnector = Connector()
        let newLabel = ConnectorLabel(connector: newConnector)
        newLabel.sizeToFit()
        newLabel.center = midPoint
        self.addConnectorLabel(newLabel, topPriority: false, automaticallyConnect: false)
        
        firstConstraintView.connectPort(firstConnectorPort, connector: newConnector)
        secondConstraintView.connectPort(secondConnectorPort, connector: newConnector)
        self.needsSolving = true
        self.needsLayout = true
        
        return newLabel
    }
    
    func connectorLabelAtPoint(point: CGPoint) -> ConnectorLabel? {
