public static void processEventCommandKeyDown(Event e, AXModel model)
    {
        switch (e.keyCode)
        {
        case KeyCode.L:
            if (model.selectedPOs != null && model.selectedPOs.Count == 1)
            {
                LibraryEditor.doSave_MenuItem(model.selectedPOs[0]);

                if (e.type != EventType.Repaint && e.type != EventType.Layout)
                {
                    e.Use();
                }
            }
            break;

        case KeyCode.V:
            // this paste waste uncaught by EventType.ExecuteCommand or EventType.ValidateCommand
            // beacuse alt or command were held down
            Undo.RegisterCompleteObjectUndo(model, "Paste");

            if (e.shift)
            {
                if (e.alt)
                {
                    model.duplicateSelectedPOs();
                }
                else
                {
                    model.replicateSelectedPOs();
                }

                model.isAltered(6);


                if (e.type != EventType.Repaint && e.type != EventType.Layout)
                {
                    e.Use();
                }
            }

            break;

        case KeyCode.D:
            Undo.RegisterCompleteObjectUndo(model, "Duplicate");
            //Debug.Log ("DUPLICATE.....KeyCode.D");
            if (model.selectedPOs.Count > 0)
            {
                AXParametricObject selectedPO = model.selectedPOs[0];
                if (e.shift)
                {
                    replicatePO(selectedPO);
                }
                else if (e.alt)
                {
                    duplicatePO(selectedPO);
                }
                else
                {
                    //Debug.Log ("instancePO");
                    instancePO(selectedPO);
                }
            }

            // "Duplicate" is caught by the validateCommand and processed here in processEventCommand()

            model.isAltered(7);

            if (e.type != EventType.Repaint && e.type != EventType.Layout)
            {
                e.Use();
            }
            break;

        case KeyCode.Backspace:

            string focusedControlName = GUI.GetNameOfFocusedControl();


            if (string.IsNullOrEmpty(focusedControlName) || !focusedControlName.Contains("_Text_"))
            {
                Undo.RegisterCompleteObjectUndo(model, "Delete");

                if (e.shift)
                {
                    model.deleteSelectedPOsAndInputs();
                }
                else
                {
                    model.deleteSelectedPOs();
                }

                model.isAltered(8);
                e.Use();
            }

            break;
        }

        // Update EditorWindow
        ArchimatixEngine.repaintGraphEditorIfExistsAndOpen();
    }